是否可以配置GDB,以便在正常程序终止时自动退出?
我正在调试OSX上的一个shell脚本,中间有神秘的segfault。如果在脚本之外执行,则有问题的命令不会发生段错误。是否可以配置GDB,以便在正常程序终止时自动退出?
所以我需要以附加GDB的脚本运行所有程序,所以我可以调试此段错误。是否可以配置GDB,这样它将运行程序并退出程序正确终止?我曾尝试下面的代码:
echo file ifconfig > gdbcfg
echo run >> gdbcfg
echo quit >> gdbcfg
gdb -x gdbcfg
但这不是工作,因为GDB尝试应用正常终止:(前执行quit
命令是否有可能以某种方式指示GDB等待应用程序正常终止,之后退出。 ?
也许我的做法是太情结,它只是一些GDB标志像“加载和运行该应用程序,退出如果一切正常”?
为什么不只是使这一进程转储核心文件,并对其进行分析后来用gdb?我的意思是ulimit -c unlimited然后(在核心被转储后)gdb ./process核心?
但是,这是行不通的,因为GDB试图执行应用程序终止
之前没有退出命令:它不工作,因为(假设您贴上您实际码)gdbcfg
包含单个quit
后你的命令被执行(并且没有run
)。你想要的是:
echo file ifconfig > gdbcfg
echo run >> gdbcfg
echo quit >> gdbcfg
gdb -x gdbcfg
拼出一个更UNIXy方法是:
echo >gdbcfg <<EOF
file ifconfig
run
quit
EOF
gdb -x gdbcfg
更新:
如果gdbcfg
文件内容包含所有三个命令,那么你的理解问题是不正确:在执行下一个命令之前,GDB将等待每个命令完成。
对不起,这是在这里发布的代码示例中的拼写错误。实际文件是用vi编辑的,并且有全部3个命令:(P.S.ЗатрюксEOFспасибо,как-тояпрогляделтакойочевидныйспособиспользованияheredoc :) – grigoryvp 2012-03-13 16:55:07
我用nix工具链不太好,所以这个方法在技术上对我很难,问题太多。我不知道如何让shell脚本在第一段错误后停止(以及第一段后面的段错误在哪里)。我不知道如何正确地转储核心并将其加载回GDB。所以我认为就在每个应用程序开始之前,在shell脚本中,并打入GDB将是最简单的解决方案:)。 – grigoryvp 2012-03-13 16:44:43
ulimit -c unlimited将强制崩溃进程转储名为“core”的核心文件。你可以让你的脚本在每个命令后检查“核心”文件,如果存在则退出(如果[-f core];然后退出; fi)退出。然后运行gdb,第一个参数是崩溃的进程,第二个参数是核心文件名(“core”)。就这样。 – strkol 2012-03-13 16:56:34