[英]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.