c - 如何执行逐行崩溃调试来处理 c 中的 "has stopped working"错误?

标签 c debugging crash gdb

我有一个用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 命令)所需的所有线索,以便向您显示您所在的位置。

在这种情况下,您可以尝试这样的操作:

  1. 启动 gdb,在 main 上设置断点,运行程序,等待断点被命中。
  2. 使用 n 命令单步执行程序,该命令会跳过而不是深入到函数中。 (也就是说,每个被调用的函数都会同时运行;您不会递归地单步执行到每个函数。)您的单步执行之一迟早会跳过崩溃的函数。现在您已经缩小了范围。
  3. 在该函数上设置断点。
  4. 重新运行该程序。
  5. 当您在麻烦的函数中遇到断点时,再次开始单步执行。迟早你的一个单步会进入一个崩溃的子函数。现在您已经缩小了范围。
  6. 继续以这种方式,直到找到导致崩溃的实际行。

关于c - 如何执行逐行崩溃调试来处理 c 中的 "has stopped working"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49950163/

相关文章:

debugging - 代码执行过程中上报信息 : best design

c++ - `myLibrary!__scrt_stub_for_is_c_termination_complete+0x12345`是什么符号

AngularJS IE9 由于附加组件而崩溃

C - 计算字符串中可能的不重复组合的数量

c - 双核 x86 可以处理字节级并发访问(?)还有谁?

C 如何将 strcat 与静态偏移量字符数组一起使用

macos - webView不适用于osx

c - 检查文件是否存在后更改 fopen 模式的正确方法是什么?

sql - 列 'tblGender.ID' 与外键 'tblPerson.GenderID' 中引用列 'tblPerson_GenderID_FK' 的数据类型不同

objective-c - ARC + NSLocalizedString + NSMenuItem#title == 内存问题