繁体   English   中英

Linux / C ++如何调试发布应用程序

[英]Linux/C++ How to debug release application

我有linux c ++多线程应用程序。 现在它已在生产服务器上进行测试并具有段错误。 问题是我无法在任何测试服务器上重现该错误,也无法访问生产服务器。 我没有转储或任何其他有用的信息。 只有行:segfault at 0000000046bf0fb8 rip 000000000048ac6b rsp 0000000046bf0fa0 error 6

我想问社区我可以从这条线路获得一些信息,这些信息将有助于减少我应该搜索的地方的区域。 由于速度慢,我无法在生产上运行调试版本。 我可以添加什么来帮助我调试? 这个bug看起来像多线程的bug,很难重现。 但我不确定,因为应用程序可以处理来自MTA的许多不同的电子邮件。

平台:Linux

编译器行:g ++ -O3 -D_REENTRANT

谢谢。

upd。:谢谢你的回答。 我可以包含调试信息。 我想知道调试发布版本的基本方法。 例如,我有转储和发布版本。 我该怎么办? 我该怎么读? 您能用几句话解释如何调试应用程序吗? 谢谢。

正如Andy所说,在发布版本时保留调试符号。

如果这使得完成的可执行文件的大小不可接受地大,那么您可以复制最终的可执行文件并通过strip运行它以删除调试符号。 这样你就有两个相同的可执行文件,除了一个有调试符号而另一个没有。 将没有符号的那个放在生产服务器上。 当它发生段错误时,请对仍包含调试符号的可执行文件的副本进行调试。

我最近一直在阅读gdb手册,他们建议将调试符号留在例如g++ -g

由于您无权访问生产服务器,因此可能包含一些将数据输出到文本文件的基本日志记录功能。 您应该能够大致缩小发生错误的位置,具体取决于哪些数据已输出到您的日志文件。

即使您没有使用调试标志构建应用程序,也可以使用gdb在segfaults的位置获取程序的回溯。 这至少可以让您了解应用程序段错误的位置。

gdb <your_app_exe>
gdb> run
gdb> backtrace

要么

gdb <your_app_exe>
gdb> core-file <generated_core_file>

您可以(并且应该)使用调试信息构建版本可执行文件。 如果您不想分发包含调试信息的可执行文件,则可以调试信息分开并稍后安装以进行调试。 这就是我们在申请中所做的事情。

好吧,我发现了另一个解决方案,我非常频繁地使用,我们通常得到堆栈(在这种情况下我们得到)。

我有一个可执行文件,我们部署在一些嵌入式平台上。 假设我的可执行文件是服务器。 我使用addr2line -e ./server并粘贴我从客户那里得到的堆栈。 它会告诉你问题发生的细节。

它可能会帮助你。

谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM