我们在专有的 assert
中使用堆栈跟踪来捕捉开发人员的错误 - 当发现错误时,会打印堆栈跟踪。
我发现 gcc 的对 backtrace()
/ backtrace_symbols()
方法不足:
- 名称被破坏
- 没有线路信息
第一个问题可以通过 abi::__cxa_demangle 解决。
然而,第二个问题更加棘手。我找到 了 backtrace_symbols() 的替代品。这比 gcc 的 backtrace_symbols() 更好,因为它可以检索行号(如果使用 -g 编译)并且您不需要使用 -rdynamic 编译。
悬停代码是 GNU 许可的,所以恕我直言,我不能在商业代码中使用它。
有什么建议吗?
附言
gdb 能够打印出传递给函数的参数。可能要求已经太多了:)
PS 2
类似的问题(感谢 nobar)
原文由 dimba 发布,翻译遵循 CC BY-SA 4.0 许可协议
不久前 我回答了一个类似的问题。您应该查看方法 #4 上可用的源代码,该方法还打印行号和文件名。
我对方法#3 进行了一个小改进,以打印行号。这也可以复制到方法 #2 上。
基本上,它使用 addr2line 将地址转换为文件名和行号。
下面的源代码打印所有本地函数的行号。如果调用来自另一个库的函数,您可能会看到几个
??:0
而不是文件名。此代码应编译为:
gcc sighandler.c -o sighandler -rdynamic
程序输出: