我正在使用GCC编译器在Linux上工作.当我的C++程序崩溃时,我希望它能自动生成一个堆栈跟踪.
我的程序由许多不同的用户运行,它也可以在Linux,Windows和Macintosh上运行(所有版本都使用编译gcc).
我希望我的程序能够在崩溃时生成堆栈跟踪,并且在用户下次运行它时,它会询问他们是否可以将堆栈跟踪发送给我,以便我可以追踪问题.我可以处理向我发送信息,但我不知道如何生成跟踪字符串.有任何想法吗?
有没有办法在每次调用某个函数时在C或C++中正在运行的进程中转储调用堆栈?我的想法是这样的:
void foo()
{
   print_stack_trace();
   // foo's body
   return
}
其中的print_stack_trace工作方式类似于callerPerl.
或类似的东西:
int main (void)
{
    // will print out debug info every time foo() is called
    register_stack_trace_function(foo); 
    // etc...
}
在哪里register_stack_trace_function放置某种内部断点,这将导致在调用时打印堆栈跟踪foo.
在某些标准C库中是否存在这样的事情?
我正在使用GCC在Linux上工作.
我有一个测试运行,基于一些不应该影响此行为的命令行开关,行为不同.我的代码有一个伪随机数生成器,我假设它是基于这些开关被不同地调用的.我希望能够使用每组开关运行测试,并查看随机数生成器是否针对每个开关进行不同的调用.
这是一个复杂的过程,因为它也取决于Boost版本和平台。
我正在使用boost stacktrace在某些断言失败的地方打印backtrace。有一些外部编译时和运行时dep,具体取决于您使用的是哪种模式(链接介绍了〜5个模式)。我更喜欢基于调试信息和导出信息的东西(我认为后者也可以在生产版本中使用)。但是,我可以得到既不默认模式或工作BOOST_STACKTRACE_USE_ADDR2LINE或BOOST_STACKTRACE_USE_BACKTRACE-所有3只显示在我的实际的程序代码的调用堆栈地址-看到一个谷歌测试测试堆栈跟踪如下:
 0# 0x000055E47D43BDC2 in Debug/myprog
 1# 0x000055E47D489055 in Debug/myprog
 2# 0x000055E47D567FDF in Debug/myprog
 3# 0x000055E47D560CDE in Debug/myprog
 4# void testing::internal::HandleExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) in /usr/lib/libgtest.so.1.8.1
 5# testing::Test::Run() in /usr/lib/libgtest.so.1.8.1
 6# testing::TestInfo::Run() in /usr/lib/libgtest.so.1.8.1
 7# testing::TestCase::Run() in /usr/lib/libgtest.so.1.8.1
 8# testing::internal::UnitTestImpl::RunAllTests() in /usr/lib/libgtest.so.1.8.1
我尝试了什么:-rdynamic,-fno-pie和-fPIC,(我已经在-O0上),-ggdb3而不是默认的-g3,没有任何函数名称显示出来。
我正在使用:gcc 8.2,boost 1.69(stracktrace库的仅标头模式),Arch Linux(在该系统上,我必须手动安装未打包的libbacktrace,所以我更喜欢使用ADDR2LINE方法)
编辑:更新到最新的boost.stacktrace的链接。
Edit2:我注意到boost.stacktrace文档包含此提示
由于地址空间布局随机化,共享库中的函数名称可能无法解码。总比没有好。
...听起来很有帮助,但对我来说却是另一回事,我没有在自己的可执行文件中获取符号,但是libgtest.so例如。因此,好像调试信息设置有问题。任何想法表示赞赏。