使用backtrace_symbols获得异常时堆栈打印的问题

zerg_chn 2011-07-06 11:01:26
我编写了一个小程序,希望使用backtrace 和 backtrace_symbols 获得程序异常时的堆栈打印。

但结果我获得的是这些:

./test(__gxx_personality_v0+0x3d9) [0x8048c01]
./test [0x8048dfe]
[0x126440]
./test(__gxx_personality_v0+0xdb) [0x8048903]
./test(__gxx_personality_v0+0x11c) [0x8048944]
/lib/libc.so.6(__libc_start_main+0xdc) [0x6a5e8c]
./test(__gxx_personality_v0+0x49) [0x8048871]

这种信息对我来说没什么用,我用google查找后发现需要在编译时增加一个开关 -rdynamic 。

于是我加了,编译命令如下:

g++ -c --rdynamic -o ../source/test.o ...

但是获得结果没有任何改变,没有出现一个我自己的函数名,全都是该死的__gxx_personality_v0。

请问我该怎么办才能让这个开关生效?
...全文
628 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lvyinghong 2011-07-15
  • 打赏
  • 举报
回复
这个怎么能说没有用呢,根据地址 就可以拿到函数名的。

你再用 -g 编译一个,然后使用addr2line 命令就可以从0x8048c01 这样的地址转换得到源代码的行数了
threeleafzerg007 2011-07-15
  • 打赏
  • 举报
回复
方法之一是 你可以把你的函数声明放在

#ifdef __cplusplus
extern "C" {
#endif
function_name

#ifdef __cplusplus
}
#endif
threeleafzerg007 2011-07-15
  • 打赏
  • 举报
回复
这个应该是需要去除C++ name mangling。 nm 里可以 -C , backtrace 还真不太清楚,我查查
justkk 2011-07-06
  • 打赏
  • 举报
回复
是不是需要打开-g 选项
zerg_chn 2011-07-06
  • 打赏
  • 举报
回复
试过了,没有用啊

23,110

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧