确定应用程序的退出点。 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进程控制系列文章,你确定不点进来看看?
Windows 下使用 VScode 运行 C/C++ 程序