如何执行逐行崩溃调试以处理 c 中的 "has stopped working" 错误?
How can I perform line by line crash debugging to deal with "has stopped working" error in c?
我有一个用 GCC.When 编译的 c 项目 我 运行 我的 test.exe 程序以 "test.exe has stopped working" 结尾但编译 successfully.How 我可以调试我的程序吗?可以找到我的错误在哪里吗?
技巧一:
我尝试在每一行代码的开头使用 printf("Successful 1..."),printf("Successful 2...") 但此方法是 frustrating.Are 那里有工具 (gdb...) 来调试我的代码一行一行给我?
printf("Successful 1...")
//code
printf("Successful 2...")
//code
如何使用 GDB 逐行调试我的程序?
可以直接用GDB去错误行吗?
编辑 1:
我使用 gdb 并键入 运行 命令并得到以下没有帮助的输出(分段错误但在哪里?):
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? 不包含对我的 question.Not 可能重复我的答案
的有用答案
编辑3:(bt方法输出)
我的程序包含 6 个源文件和 6 个头文件 files.And 每个头文件和源文件都包含三个以上的函数指针,它们执行一些 action.I 尝试使用 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
您遇到分段错误,这就是您的应用程序未 运行ning 的原因。分段错误是一个 运行 时间问题,即使您的程序编译成功。
在 gdb
你得到这个之后:
Program received signal SIGSEGV, Segmentation fault.
输入bt
。 gdb
的 bt
命令将向您显示 运行ning 程序的回溯。它会告诉您您的程序采用了哪个流程,以及导致分段错误并使您的应用程序崩溃的确切行。
如果您在 debug
模式下构建应用程序,bt
的输出将更多 'readable'。如果您使用的是 gcc,则需要添加 -g
标志以在 debug
模式下构建
有时,如果您的错误特别严重,它会覆盖堆栈并破坏 gdb(尤其是 bt
命令)向您显示您所在位置所需的所有线索。
在这种情况下,您可以尝试这样的操作:
- 启动gdb,在
main
上设置断点,运行你的程序,等待命中断点。
- 使用
n
命令单步执行您的程序,该命令跳过而不是进入函数。 (也就是说,每个被调用的函数 运行 一次全部;您不是递归地单步执行到每个函数。)您的单步操作迟早会越过一个崩溃的函数。现在您已经缩小了范围。
- 在该函数上设置断点。
- 重新运行程序。
- 当你在麻烦的函数中遇到断点时,再次开始单步执行。迟早你的一个单步会进入一个崩溃的子函数。现在您已经缩小了范围。
- 以这种方式继续,直到找到导致崩溃的实际线路。
我有一个用 GCC.When 编译的 c 项目 我 运行 我的 test.exe 程序以 "test.exe has stopped working" 结尾但编译 successfully.How 我可以调试我的程序吗?可以找到我的错误在哪里吗?
技巧一: 我尝试在每一行代码的开头使用 printf("Successful 1..."),printf("Successful 2...") 但此方法是 frustrating.Are 那里有工具 (gdb...) 来调试我的代码一行一行给我?
printf("Successful 1...")
//code
printf("Successful 2...")
//code
如何使用 GDB 逐行调试我的程序? 可以直接用GDB去错误行吗?
编辑 1: 我使用 gdb 并键入 运行 命令并得到以下没有帮助的输出(分段错误但在哪里?):
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? 不包含对我的 question.Not 可能重复我的答案
的有用答案编辑3:(bt方法输出) 我的程序包含 6 个源文件和 6 个头文件 files.And 每个头文件和源文件都包含三个以上的函数指针,它们执行一些 action.I 尝试使用 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
您遇到分段错误,这就是您的应用程序未 运行ning 的原因。分段错误是一个 运行 时间问题,即使您的程序编译成功。
在 gdb
你得到这个之后:
Program received signal SIGSEGV, Segmentation fault.
输入bt
。 gdb
的 bt
命令将向您显示 运行ning 程序的回溯。它会告诉您您的程序采用了哪个流程,以及导致分段错误并使您的应用程序崩溃的确切行。
如果您在 debug
模式下构建应用程序,bt
的输出将更多 'readable'。如果您使用的是 gcc,则需要添加 -g
标志以在 debug
模式下构建
有时,如果您的错误特别严重,它会覆盖堆栈并破坏 gdb(尤其是 bt
命令)向您显示您所在位置所需的所有线索。
在这种情况下,您可以尝试这样的操作:
- 启动gdb,在
main
上设置断点,运行你的程序,等待命中断点。 - 使用
n
命令单步执行您的程序,该命令跳过而不是进入函数。 (也就是说,每个被调用的函数 运行 一次全部;您不是递归地单步执行到每个函数。)您的单步操作迟早会越过一个崩溃的函数。现在您已经缩小了范围。 - 在该函数上设置断点。
- 重新运行程序。
- 当你在麻烦的函数中遇到断点时,再次开始单步执行。迟早你的一个单步会进入一个崩溃的子函数。现在您已经缩小了范围。
- 以这种方式继续,直到找到导致崩溃的实际线路。