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



我有一个用GCC编译的c项目。当我运行测试时.exe程序以"test.exe已停止工作"结尾,但编译成功。如何调试我的程序以及如何找到我的错误所在?

技术1: 我尝试在每一行代码的开头打印f("成功1..."),printf("成功2..."),但这种方法令人沮丧。是否有工具(gdb...)可以为我逐行调试我的代码?

printf("Successful 1...")
//code
printf("Successful 2...")
//code

如何使用 GDB 逐行调试程序? 我可以直接使用 GDB 转到错误行吗?

编辑 1: 我使用 gdb 并键入 run 命令并获得以下输出,这没有帮助(分段错误但在哪里?

Starting program: C:Usersq..././bin/test.exe
[New Thread 3292.0x22b8]
[New Thread 3292.0x1fb8]
Program received signal SIGSEGV, Segmentation fault.
0x7696e3e3 in ungetwc () from C:WINDOWSSysWOW64msvcrt.dll

编辑 2: 如何使用 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. 以这种方式继续,直到找到导致崩溃的实际行。

您遇到分段错误,这就是您的应用程序未运行的原因。分段错误是一个运行时问题,即使程序成功编译也是如此。

在你得到这个之后的gdb

Program received signal SIGSEGV, Segmentation fault.

键入btgdbbt命令将显示正在运行的程序的回溯。它告诉您程序采用哪个流程,以及导致分段错误并使应用程序崩溃的确切行。

如果在debug模式下构建应用程序,则bt的输出将更具"可读性"。如果您使用 gcc,则需要添加-g标志以在debug模式下构建

相关内容

最新更新