我有一个用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
命令)需要的所有线索,以便向你显示你在哪里。
在这种情况下,您可以尝试如下操作:
- 启动 gdb,在
main
上设置断点,运行程序,等待命中断点。 - 使用
n
命令单步执行程序,该命令将单步执行函数,而不是向下执行函数。 (也就是说,每个被调用的函数一次运行所有函数;您不会单步递归地向下进入每个函数。 迟早,您的一个步骤会单步跳过崩溃的函数。 现在你已经缩小了一点。 - 在该函数上设置断点。
- 重新运行该程序。
- 当您遇到麻烦函数内的断点时,再次开始单步执行。 迟早,您的一个步骤会进入崩溃的子函数。 现在你已经进一步缩小了范围。
- 以这种方式继续,直到找到导致崩溃的实际行。
您遇到分段错误,这就是您的应用程序未运行的原因。分段错误是一个运行时问题,即使程序成功编译也是如此。
在你得到这个之后的gdb
:
Program received signal SIGSEGV, Segmentation fault.
键入bt
。gdb
的bt
命令将显示正在运行的程序的回溯。它告诉您程序采用哪个流程,以及导致分段错误并使应用程序崩溃的确切行。
如果在debug
模式下构建应用程序,则bt
的输出将更具"可读性"。如果您使用 gcc,则需要添加-g
标志以在debug
模式下构建