Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux/C++;如何调试发布应用程序 我有Linux C++多线程应用程序。现在,它已经在生产服务器上进行了测试,并出现了故障。问题是,我无法在任何测试服务器上重现该错误,并且无法访问生产服务器。我没有转储或任何其他有用的信息。唯一行: 00000000 46BF0FB8 rip 0000000000 48AC6B rsp 00000000 46BF0FA0处的SEGFULT错误6_C++_Linux_Multithreading - Fatal编程技术网

Linux/C++;如何调试发布应用程序 我有Linux C++多线程应用程序。现在,它已经在生产服务器上进行了测试,并出现了故障。问题是,我无法在任何测试服务器上重现该错误,并且无法访问生产服务器。我没有转储或任何其他有用的信息。唯一行: 00000000 46BF0FB8 rip 0000000000 48AC6B rsp 00000000 46BF0FA0处的SEGFULT错误6

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:谢谢你的回答。我可以包括调试信息。我想知道调试发布版本的基本方法。例如,我有转储和发布版本。我该如何继续。我应该读些什么?如果可能的话,你能简单地

我想问问社区,我能从这条线路上得到一些信息吗?这些信息将有助于减少我应该搜索的地方的面积。我无法在产品上运行调试构建,因为它的速度很慢。我可以向发布版添加哪些帮助我调试的内容?这个bug看起来像多线程bug,很难重现。但我不确定,因为应用程序可以处理来自MTA的许多不同的电子邮件

平台:Linux

编译器行:g++-O3-D_可重入

多谢各位


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>