我有linux c ++多线程应用程序.现在它已在生产服务器上进行测试并具有段错误.问题是我无法在任何测试服务器上重现该错误,也无法访问生产服务器.我没有转储或任何其他有用的信息.只有行:segfault at 0000000046bf0fb8 rip 000000000048ac6b rsp 0000000046bf0fa0 error 6
我想问社区我可以从这样的线路获得一些信息,这些信息将有助于减少我应该搜索的地方的区域.由于速度慢,我无法在生产上运行调试版本.我可以添加哪些内容来帮助我调试?这个bug看起来像多线程的bug,很难重现.但我不确定,因为应用程序可以处理来自MTA的许多不同的电子邮件.
平台:Linux
编译器行:g ++ -O3 -D_REENTRANT
谢谢.
upd.:谢谢你的回答.我可以包含调试信息.我想知道调试发布版本的基本方法.例如,我有转储和发布版本.我该怎么办?我该怎么读?您能用几句话解释如何调试应用程序吗?谢谢.
SEGSEGV
进入共享库后,我试图获取堆栈跟踪并将其保存到文件中。共享库是闭源产品的插件。所有这些都适用于生产,但我无法直接访问它。
我的代码捕获SIGSEGV
信号,打印堆栈跟踪并退出。我有这样的事情:
/opt/ecelerity/libexec/site/ec_attachextensions.so [0x2aecc2019f11] /opt/ecelerity/libexec/site/ec_attachextensions.so [0x2aecc2019f11] /opt/ecelerity/libexec/site/ec_attachextensions.so [0x2aecc2019fee] /opt/ecelerity/ libexec/site/ec_attachextensions.so [0x2aecc201a587]
/opt/ecelerity/sbin/ecelerity [0x501235]
/opt/ecelerity/sbin/ecelerity(sieve_seng_execute+0x82) [0x506d32] /opt/ecelerity/libexec/validate/sieve.so [0x2aecc2862c9e] /opt/ecelerity/sbin/ecelerity(validate_data+0xa5) [0x4a90d5] /opt/ ecelerity/sbin/ecelerity(esmtp_message_factory+0x154e) [0x46eace] /opt/ecelerity/sbin/ecelerity(schedule_event_and_dispatch+0x6a) [0x49c59a]
问题是我无法获得共享库的函数名称和其中的偏移量。据我了解,我可以在 addr2line 实用程序的帮助下找到给定地址的函数名称/文件名,然后在/proc/$PID/maps
.
之后我正在执行类似的事情:
addr2line -e /opt/ecelerity/libexec/site/ec_attachextensions.so (LIBRARY_OFFSET_FROM_MAPS_FILE - 0x2aecc2019f11)
Run Code Online (Sandbox Code Playgroud)
0x2aecc2019f11
上面堆栈跟踪的地址在哪里。我想知道有什么方法可以在不接触地图文件的情况下在堆栈跟踪中获取函数名称?换句话说,我该如何编程呢?在这里会有dladdr
帮助吗(在我的例子中dladdr
无法从函数提供的地址获取函数名称backtrace
)?