我有一个用GCC编译的c项目。当我运行我的test.exe程序时,以“test.exe已停止工作”结束,但编译成功。我如何调试我的程序以及如何找到我的错误在哪里?
技巧1: 我尝试在每一行代码的开头打印 printf("Successful 1..."),printf("Successful 2...") 但这种方法令人沮丧。是否有工具(gdb...)可以调试我的代码一行一行地为我服务?
printf("Successful 1...")
//code
printf("Successful 2...")
//code
如何使用 GDB 逐行调试我的程序? 我可以直接用GDB去错误行吗?
编辑1: 我使用 gdb 并输入 run 命令并得到以下输出,这没有帮助(段错误但在哪里?):
Starting program: C:\Users\q\..././bin/test.exe
[New Thread 3292.0x22b8]
[New Thread 3292.0x1fb8]
Program received signal SIGSEGV, Segmentation fault.
0x7696e3e3 in ungetwc () from C:\WINDOWS\SysWOW64\msvcrt.dll
编辑2: How to debug using gdb?不包含对我的问题有帮助的答案。不可能与我的答案重复
编辑3:(bt方法输出) 我的程序包含 6 个源文件和 6 个头文件。每个头文件和源文件都包含三个或以上执行某些操作的函数指针。我尝试使用 gdb bt 进行调试并获得以下输出:
#1 0x00000001 in ?? ()
#2 0x00000073 in ?? ()
#3 0x00000032 in ?? ()
#4 0x00000000 in ?? ()
我的生成文件:
all: compile run
compile :
gcc -I ./include/ -o ./lib/... .o -c ./src/... .c
gcc -I ./include/ -o ./lib/... .o -c ./src/... .c
gcc -I ./include/ -o ./lib/... .o -c ./src/... .c
gcc -I ./include/ -o ./lib/... .o -c ./src/... .c
gcc -I ./include/ -o ./lib/... .o -c ./src/... .c
gcc -I ./include/ -o ./bin/test ./lib/... .o ./lib/... .o ./lib/... .o ./lib/... .o ./lib/... .o ./src/test.c
run:
gdb ./bin/test.exe
最佳答案
有时,如果您的错误特别严重,它会覆盖堆栈并销毁 gdb(特别是 bt
命令)所需的所有线索,以便向您显示您所在的位置。
在这种情况下,您可以尝试这样的操作:
- 启动 gdb,在
main
上设置断点,运行程序,等待断点被命中。 - 使用
n
命令单步执行程序,该命令会跳过而不是深入到函数中。 (也就是说,每个被调用的函数都会同时运行;您不会递归地单步执行到每个函数。)您的单步执行之一迟早会跳过崩溃的函数。现在您已经缩小了范围。 - 在该函数上设置断点。
- 重新运行该程序。
- 当您在麻烦的函数中遇到断点时,再次开始单步执行。迟早你的一个单步会进入一个崩溃的子函数。现在您已经缩小了范围。
- 继续以这种方式,直到找到导致崩溃的实际行。
关于c - 如何执行逐行崩溃调试来处理 c 中的 "has stopped working"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49950163/