确定应用程序的退出点。 C++/Linux

Posted

技术标签:

【中文标题】确定应用程序的退出点。 C++/Linux【英文标题】:Determing exit point of application. C++/Linux 【发布时间】:2009-04-19 00:30:40 【问题描述】:

我正在开发一个大型应用程序 (ns2),有人在其中放置了一个 exit(1),没有任何调试或打印语句,它正在执行。我不想手动检查每个调用 exit 的文件来找出程序退出的原因。是否可以确定程序退出的位置?这是在 Linux 上运行并用 C++ 编码的。是否可以在 gdb 中做这样的事情?

【问题讨论】:

退出断点可能是最好的方法(或 Greg 的退出替换),但我确实想提一下 "find , -name '*.c' -exec grep 'exit' \; "作为扫描文件之外的另一种选择。 【参考方案1】:

当然。在 exit(3) 的开头放置一个断点。当它中断时,查看堆栈。

第二个选择,在 truss(1) 下运行(我很确定有 truss 的 Linux 版本。)

或strace(1)。

更新

其实我在另一个问题中遇到了另一个方法:here's a link。

【讨论】:

除非他们足够残忍地调用 _exit() 或 _Exit() 而不是 exit()...可能最好将这三个都困住。 truss/strace 不会识别从哪里调用系统调用。 没有,但我通常发现来自 truss、strace 或 ltrace 的序列(另一个选项)给了我足够的线索来找到它。如果一切都失败了,我在评论中添加的 find/grep 将起作用。【参考方案2】:

如果您提供自己的exit() 实现,则将优先使用该实现而不是库中的实现。构建它,在调试器中加载它,在你的 exit() 上放置一个断点,运行程序,看看它是从哪里来的。

或者正如Charlie 所说,只需在库exit() 上放置一个断点。如果您想运行一些其他特定的代码,请使用上述方法。

【讨论】:

【参考方案3】:

由于您似乎可以访问源代码,因此我只需搜索退出调用并分析代码即可。然后你很可能也可以通过用更合适的东西替换出口来修复它。

如果你所有的代码都在src目录下

grep -r exit src

应该找出所有出现的单词exit

如果您无权访问代码,请参考 Charlie 的建议。

【讨论】:

以上是关于确定应用程序的退出点。 C++/Linux的主要内容,如果未能解决你的问题,请参考以下文章

linux c开发: 在程序退出时进行处理

爆肝近万字总结----Linux进程控制系列文章,你确定不点进来看看?

Windows 下使用 VScode 运行 C/C++ 程序

linux下c程序 daemonfork与创建pthread的顺序问题

如何在Linux下使用Windows的程序?

从 Fortran 到 Linux 的退出代码