我有linux c ++多线程应用程序。现在它已在生产服务器上进行测试并具有段错误。问题是我无法在任何测试服务器上重现该错误,也无法访问生产服务器。我没有转储或任何其他有用的信息。只行: segfault at 0000000046bf0fb8 rip 000000000048ac6b rsp 0000000046bf0fa0 error 6
我想问社区我可以从这条线路获得一些有助于减少我应该搜索的地方的区域的信息。由于速度慢,我无法在生产上运行调试版本。我可以添加什么来帮助我调试?这个bug看起来像多线程的bug,很难重现。但我不确定,因为应用程序可以处理来自MTA的许多不同的电子邮件。
平台:Linux
编译器行:g ++ -O3 -D_REENTRANT
谢谢。
upd:感谢您的回答。我可以包含调试信息。我想知道调试发布版本的基本方法。例如,我有转储和发布版本。我该怎么办?我该怎么读?您能用几句话解释如何调试应用程序吗?谢谢。
答案 0 :(得分:13)
正如Andy所说,在发布版本时请保留调试符号。
如果这使得已完成的可执行文件的大小大得令人无法接受,那么您可以复制最终的可执行文件并通过strip
运行它以删除调试符号。通过这种方式,您可以使用两个可执行文件,除了一个具有调试符号而另一个没有调试符号。将没有符号的那个放在生产服务器上。当它发生段错误时,请对仍包含调试符号的可执行文件的副本进行调试。
答案 1 :(得分:5)
我最近一直在阅读gdb手册,他们建议将调试符号留在例如g++ -g
。
由于您无权访问生产服务器,因此可能包含一些将数据输出到文本文件的基本日志记录功能。您应该能够大致缩小发生错误的位置,具体取决于哪些数据已输出到您的日志文件。
答案 2 :(得分:5)
即使您没有使用调试标志构建应用程序,也可以使用gdb在segfaults的位置获取程序的回溯。这至少可以让您了解应用程序的段落错误。
gdb <your_app_exe>
gdb> run
gdb> backtrace
或
gdb <your_app_exe>
gdb> core-file <generated_core_file>
答案 3 :(得分:3)
您可以(并且应该)使用调试信息构建版本可执行文件。如果您不想分发包含调试信息的可执行文件,则可以separate调试信息并稍后安装以进行调试。这就是我们在申请中所做的事情。
答案 4 :(得分:1)
我发现另一个解决方案,我经常使用它,我们通常得到堆栈(在这种情况下我们得到)。
我有一个可执行文件,我们部署在某个嵌入式平台上。 假设我的可执行文件是服务器。 我使用addr2line -e ./server 然后我粘贴我从客户那里得到的堆栈。 它会告诉你问题发生的细节。
它可能对你有帮助。
由于