Dmi*_*riy 9 c++ linux multithreading
我有linux c ++多线程应用程序.现在它已在生产服务器上进行测试并具有段错误.问题是我无法在任何测试服务器上重现该错误,也无法访问生产服务器.我没有转储或任何其他有用的信息.只有行:segfault at 0000000046bf0fb8 rip 000000000048ac6b rsp 0000000046bf0fa0 error 6
我想问社区我可以从这样的线路获得一些信息,这些信息将有助于减少我应该搜索的地方的区域.由于速度慢,我无法在生产上运行调试版本.我可以添加哪些内容来帮助我调试?这个bug看起来像多线程的bug,很难重现.但我不确定,因为应用程序可以处理来自MTA的许多不同的电子邮件.
平台:Linux
编译器行:g ++ -O3 -D_REENTRANT
谢谢.
upd.:谢谢你的回答.我可以包含调试信息.我想知道调试发布版本的基本方法.例如,我有转储和发布版本.我该怎么办?我该怎么读?您能用几句话解释如何调试应用程序吗?谢谢.
Dan*_*ing 13
正如Andy所说,在发布版本时保留调试符号.
如果这使得完成的可执行文件的大小变得无法接受,那么您可以复制最终的可执行文件并运行它strip
以删除调试符号.这样你就有两个相同的可执行文件,除了一个有调试符号而另一个没有.将没有符号的那个放在生产服务器上.当它发生段错误时,请对仍包含调试符号的可执行文件的副本进行调试.
我最近一直在阅读gdb手册,他们建议将调试符号保留在例如g++ -g
.
由于您无权访问生产服务器,因此可能包含一些将数据输出到文本文件的基本日志记录功能.您应该能够大致缩小发生错误的位置,具体取决于哪些数据已输出到您的日志文件.
小智 5
即使您没有使用调试标志构建应用程序,也可以使用gdb在segfaults的位置获取程序的回溯.这至少可以让您了解应用程序段错误的位置.
gdb <your_app_exe>
gdb> run
gdb> backtrace
Run Code Online (Sandbox Code Playgroud)
要么
gdb <your_app_exe>
gdb> core-file <generated_core_file>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6826 次 |
最近记录: |