Linux/C++;如何调试发布应用程序 我有Linux C++多线程应用程序。现在,它已经在生产服务器上进行了测试,并出现了故障。问题是,我无法在任何测试服务器上重现该错误,并且无法访问生产服务器。我没有转储或任何其他有用的信息。唯一行: 00000000 46BF0FB8 rip 0000000000 48AC6B rsp 00000000 46BF0FA0处的SEGFULT错误6
我想问问社区,我能从这条线路上得到一些信息吗?这些信息将有助于减少我应该搜索的地方的面积。我无法在产品上运行调试构建,因为它的速度很慢。我可以向发布版添加哪些帮助我调试的内容?这个bug看起来像多线程bug,很难重现。但我不确定,因为应用程序可以处理来自MTA的许多不同的电子邮件 平台:Linux 编译器行:g++-O3-D_可重入 多谢各位Linux/C++;如何调试发布应用程序 我有Linux C++多线程应用程序。现在,它已经在生产服务器上进行了测试,并出现了故障。问题是,我无法在任何测试服务器上重现该错误,并且无法访问生产服务器。我没有转储或任何其他有用的信息。唯一行: 00000000 46BF0FB8 rip 0000000000 48AC6B rsp 00000000 46BF0FA0处的SEGFULT错误6,c++,linux,multithreading,C++,Linux,Multithreading,我想问问社区,我能从这条线路上得到一些信息吗?这些信息将有助于减少我应该搜索的地方的面积。我无法在产品上运行调试构建,因为它的速度很慢。我可以向发布版添加哪些帮助我调试的内容?这个bug看起来像多线程bug,很难重现。但我不确定,因为应用程序可以处理来自MTA的许多不同的电子邮件 平台:Linux 编译器行:g++-O3-D_可重入 多谢各位 upd:谢谢你的回答。我可以包括调试信息。我想知道调试发布版本的基本方法。例如,我有转储和发布版本。我该如何继续。我应该读些什么?如果可能的话,你能简单地
upd:谢谢你的回答。我可以包括调试信息。我想知道调试发布版本的基本方法。例如,我有转储和发布版本。我该如何继续。我应该读些什么?如果可能的话,你能简单地解释一下你是如何调试你的应用程序的吗?谢谢。我最近一直在阅读gdb手册,他们建议将调试符号保留在例如
g++-g
中
由于您没有访问生产服务器的权限,因此可能包括一些基本的日志功能,这些功能将数据输出到文本文件。您应该能够大致缩小错误发生的范围,这取决于哪些数据已输出到日志文件。正如Andy提到的,在生成发布版本时保留调试符号
如果这使得完成的可执行文件的大小大得令人无法接受,那么您可以制作最终可执行文件的副本,并通过
strip
来删除调试符号。这样,您就有了两个相同的可执行文件,除了一个有调试符号,另一个没有。在生产服务器上放置不带符号的。当出现故障时,根据仍然包含调试符号的可执行文件副本进行调试。您可以(并且应该)使用调试信息构建版本可执行文件。如果不希望分发包含调试信息的可执行文件,则可以删除调试信息并在以后安装以进行调试。这就是我们在应用程序中所做的。您可以使用gdb在程序出现故障时获取程序的回溯,即使您没有使用调试标志构建应用程序。这至少会让您了解应用程序的故障所在
gdb <your_app_exe>
gdb> run
gdb> backtrace
gdb
gdb>运行
gdb>回溯
或
gdb
gdb>核心文件
我找到了另一个解决方案,我经常使用它,我们通常会得到堆栈(在本例中就是这样)
我有一个可执行文件,我们部署在某个嵌入式平台上。
假设我的可执行文件是服务器。
我使用addr2line-e./server
然后我粘贴从客户那里得到的堆栈。
它将向您提供发生问题的线路的详细信息
这可能对你有帮助
谢谢谢谢。我可以包括调试信息。我想知道调试发布版本的基本方法。例如,我有转储和发布版本。我该如何继续。我应该读些什么?如果可能的话,你能简单地解释一下你是如何调试你的应用程序的吗?谢谢。@Dmitry调试版本与调试调试版本没有任何区别。您可能会体验到,当您单步执行代码时,您无法看到某些变量,因为编译器可能已在远离该位置的地方对其进行了优化,但在其他方面,这等于调试非发布版本。
gdb <your_app_exe>
gdb> core-file <generated_core_file>