使用GDB:我崩溃了(segfault)。我如何看到最终的代码行?

时间:2019-02-14 15:07:36

标签: c debugging gdb

如果这是重复的内容,请原谅我-但我似乎找不到任何直接的建议。

我有一个执行循环很多次的应用程序。在某些时候,此段错误。它是用C编写的,我一直在使用GDB进行调试。在过去,我已经打了n次数百次,对此我有话要说。但是,我认为,如果我实际上可以后退以查看故障发生的位置,那么在当前情况下将更加有效。

不幸的是,崩溃中引用了库代码(如果我没记错的话,是从预编译的库中引用的),所以我什至无法尝试查看向后的代码。而且,我相信这个图书馆。 (现在当然是:P)

如果有人可以提供一些方法来追溯到发生崩溃的文件中的代码行,我将不胜感激!

1 个答案:

答案 0 :(得分:1)

  

过去,我已经打过数百遍了,对此我有话要说。

如果您的崩溃是可重复的(例如,在对foo()进行第1234次调用后总是 崩溃),那么这是一种有用的技术,可以避免击中n数百次:

(gdb) break foo
(gdb) ignore 1 10000
(gdb) run

这时,您的程序在第foo次第N次调用时运行并崩溃。使用info break找出N是多少。现在:

(gdb) ignore 1 M  # where M == N-1
(gdb) run

现在,您停止倒数第二次致电foo。逐步执行代码,设置断点等,直到到达下一个对foo的调用(它将崩溃)。

  

但是,我认为,如果我实际上可以后退以查看故障发生的位置,那么在当前情况下效率会大大提高。

在Linux上,您可以这样做:https://rr-project.org/