【问题标题】:Help for gdb debug crash logginggdb 调试崩溃记录帮助
【发布时间】:2010-12-01 04:24:37
【问题描述】:

我一直在 GDB 中调试(C 代码)。问题是,如果我运行我的应用程序并且它崩溃了,那么控件就会返回到 main()(应用程序重新启动)。因此将不知道它在哪里坠毁。所以我花了很多时间单步执行每个函数。

我想知道是否有一个日志可以启用,它将在崩溃前生成最后一行执行。这只是我的假设,如果有其他更简单的方法请告诉我,这将为我节省大量时间!

另外,如果 gdb 生成日志,路径会在哪里?

提前致谢。

【问题讨论】:

  • 你能定义“崩溃”吗?如果有未处理的信号(例如 SIGSEGV),GDB 应该拦截它并立即停在那里,但听起来这不是正在发生的事情,所以你必须以不同的方式“崩溃”
  • 如果可以,GDB 可以处理预设命令。或者,如果日志是指堆栈跟踪,请查看tlug.up.ac.za/wiki/index.php/…。它展示了如何在 SIGSEGV 上生成堆栈跟踪。如果您知道导致崩溃的信号,请在收到该信号而不是 SIGSEGV 时生成堆栈跟踪。
  • 控制返回到 main() 和应用程序重新启动并不是一回事 - 它是真正在 main() 的第 1 行重新启动,还是在某些函数调用后才回到该行出现错误并返回?
  • @vpit3833: 不错的链接:)
  • @Jefromi:不,执行后它不会返回相同的功能。它再次启动所有初始化过程,这意味着应用程序已重新启动。

标签: debugging logging crash gdb


【解决方案1】:

这个问题我有点不清楚,但我会刺一下:

如果当崩溃进程崩溃时您将 GDB 附加到崩溃进程,崩溃应该会停止程序并让您返回 (gdb) 提示符。如果您随后键入bt,您应该会看到堆栈。

如果您没有附加 GDB, 那么this answer to a related question 可能会有所帮助。 (简而言之,也许您希望系统在程序崩溃时创建核心转储。核心转储只是一个文件,其中包含有关崩溃进程的大量信息。您可以使用带有核心转储的 GDB 来查看堆栈。 )

如果您不知道,在发生这种情况时发布您在屏幕上看到的内容,我们会猜测。

无论如何,程序绝对不应该在 main() 处重新开始。追查为什么会发生这种情况以及究竟发生了什么似乎是值得的。控制是否真的跳转到main在同一个进程中,而不是另一个进程以某种方式自动启动?

【讨论】:

    【解决方案2】:

    在 gdb 模式下运行您的程序。

     $ gdb ./myProgram
    


    将断点设置到预期位置。

     $ break functionName
    


    或者设置断点到特定的行号。

     $ break 15
    


    开始执行

     $ r
    


    's' 或 'n' 进入或退出执行

     $ s
    


    一旦程序崩溃,执行'bt'进行回溯。

     $ bt
    


    您可以通过 'up' & 'down' 命令在跟踪中上下移动

     $ up
    


    也可以采取另一种方式。以“core”作为核心转储文件的调试程序。

     $ gdb executableFilename core
     $ bt
    

    【讨论】:

      猜你喜欢
      • 2016-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多