如何利用 Emacs 来调试 C++ 程序
第一步:在 C++ 文件中设置断点
在你的 C++ 程序中设置断点,使程序在运行到此处时暂停。你可以在需要设置断点的行前加入以下代码:
int main() {
int a = 1;
int b = 2;
int c = a + b; // 在此处设置断点
return c;
}
第二步:在 Emacs 中开始调试
- 打开 Emacs,打开你的 C++ 文件。
- 按下快捷键
Alt + x
,在最下方的 Emacs 命令行中输入gdb
,然后按下回车键。 - 命令行提示符会变成
(gdb)
。输入run
命令,按下回车键开始运行程序。 - 当程序运行到你之前设置的断点处时会停下来等待调试命令。
第三步:在 Emacs 中使用调试命令
在程序暂停时,你可以使用以下调试命令:
list
- 显示当前停止的地方附近的代码行。break
- 设置一个新的断点(在代码行前)或用未加载模块中的地址设置一个新断点。delete
- 删除一个或多个已经设置的断点。next
- 执行下一条代码行。如果这一行是函数调用,则跳过整个函数并暂停在函数返回之后的下一行。step
- 进入下一个步骤。如果当前行是尚未调用的函数,则进入该函数。continue
- 继续执行程序到下一个断点或程序终止。print
- 显示变量的值。
我们来看一个示例。假设我们要查看 a
和 b
的值。我们可以在程序暂停时,输入以下命令:
print a
print b
这将显示 a
和 b
的当前值。
示例一:调试数组
让我们通过使用断点和打印命令来调试 C++ 中的数组。
#include <iostream>
using namespace std;
int main() {
int arr[5] = { 1, 2, 3, 4, 5 };
for (int i = 0; i < 5; i++) {
cout << "arr[" << i << "] = " << arr[i] << endl;
}
return 0;
}
我们想要查看数组的值及其索引。我们可以在循环中的第一行前添加以下代码:
for (int i = 0; i < 5; i++) {
int temp = 0; // 在此处设置断点
cout << "arr[" << i << "] = " << arr[i] << endl;
}
然后我们从命令行调用 GDB:
$ gdb test
在 GDB 中启动程序并等待程序停止:
(gdb) run
程序运行到断点处时暂停。我们可以打印 arr
数组的值:
(gdb) print arr[0]
$1 = 1
(gdb) print arr[3]
$2 = 4
我们还可以查看 i
的值:
(gdb) print i
$3 = 0
现在我们可以继续执行程序:
(gdb) continue
在循环的下一次迭代中,GDB 又会停下来,我们可以继续查看数组及其索引的值。
示例二:调试函数
让我们通过调试函数来进一步了解 GDB。
#include <iostream>
int sum(int a, int b) {
return a + b;
}
int main() {
int x = 10;
int y = 20;
int z = sum(x, y);
std::cout << "The sum of " << x << " and " << y << " is " << z << std::endl;
return 0;
}
我们希望调试 sum
函数。在其定义之前的行上设置一个断点并启动 GDB。
int sum(int a, int b) {
int temp = 0; // 在此处设置断点
return a + b;
}
然后从命令行启动 GDB 并运行程序:
$ gdb test
(gdb) run
当程序运行到断点处时,我们可以在函中输入以下命令:
(gdb) print a
$1 = 10
(gdb) print b
$2 = 20
我们可以使用 next
和 step
命令继续执行函数,直到它返回到主函数中。然后我们就可以退出 GDB 了。
(gdb) continue
(gdb) quit
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何利用Emacs来调试C++程序 - Python技术站