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

我有Linux C ++multithreading应用程序。 现在它在生产服务器上进行testing,并具有段错误。 问题在于我无法在任何testing服务器上重现该错误,并且无法访问生产服务器。 我没有转储或任何其他有用的信息。 只有行:segfault在0000000046bf0fb8 rip 000000000048ac6b rsp 0000000046bf0fa0错误6

我想请问社会方面,我可以从这方面得到一些资料,这些资料会减less我可以搜寻的地方的面积。 由于速度慢,我无法运行生产debugging版本。 我可以添加什么来释放哪些帮助我debugging? 这个bug看起来像multithreading的bug,很难重现。 但我不确定,因为应用程序与MTA的许多不同的电子邮件工作。

平台:Linux

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

谢谢。

更新:感谢您的答案。 我可以包含debugging信息。 我想知道debugging发布版本的基本方法。 例如我有转储和发行版本。 我应该如何继续。 我应该读什么呢? 你能用几句话来解释一下如何尽可能地debugging你的应用程序? 谢谢。

Solutions Collecting From Web of "Linux / C ++如何debugging发布应用程序"

正如Andy所提到的,当你发布版本的时候,请保留调试符号。

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

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

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

你可以使用gdb来获得程序的回溯,即使你没有使用调试标志来构建你的应用程序。 这至少会给你一个想法,你的应用程序段错误。

 gdb <your_app_exe> gdb> run gdb> backtrace 

要么

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

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

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

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

它可能会帮助你。

谢谢