C++ 是否可以将addr2line与使用版本优化参数编译的应用程序一起使用?
所以我有回溯C++ 是否可以将addr2line与使用版本优化参数编译的应用程序一起使用?,c++,linux,backtracking,backtrace,line-numbers,C++,Linux,Backtracking,Backtrace,Line Numbers,所以我有回溯 Exit with signal 11 at 2013-12-28_14:28:58.000000 /opt/s3ds/App(_Z7handlers+0x52) [0x5de322] /lib/libc.so.6(+0x32230) [0x7f6ab9b3a230] /opt/s3ds/App(_ZN17Service17Controller5frameERKf+0x505) [0x5a6b85] /opt/s3ds/App(_ZN17Service15Cloud10update
Exit with signal 11 at 2013-12-28_14:28:58.000000
/opt/s3ds/App(_Z7handlers+0x52) [0x5de322]
/lib/libc.so.6(+0x32230) [0x7f6ab9b3a230]
/opt/s3ds/App(_ZN17Service17Controller5frameERKf+0x505) [0x5a6b85]
/opt/s3ds/App(_ZN17Service15Cloud10updateEf+0x1de) [0x58642e]
/opt/s3ds/App(_ZN17Manager6updateEf+0x21b) [0x59194b]
/opt/s3ds/App(_ZN7Manager3runEv+0xd2) [0x604fa2]
/opt/s3ds/App() [0x62bfea]
/lib/libpthread.so.0(+0x68ca) [0x7f6abb0048ca]
/lib/libc.so.6(clone+0x6d) [0x7f6ab9bd7b6d]
我已使用以下参数编译了我的应用程序:
-std=c++11 -fpermissive -m64 -g -rdynamic -mtune=native -flto -O3
因此,它是一个发布版本,包含一些最少的调试信息
我想知道是否有可能使用addr2line从这种优化构建中获得任何行号
我试过了,但是我得到了??:0
比如:
$ addr2line -e ./App 0x62bfea
??:0
对于[]
中的所有地址。我知道从Service::Controller::frame
到Manager::run
(甚至可能是lambda/opt/s3ds/App()[0x62bfea]
)的跟踪中的函数都应该在我的应用程序代码中(不在某些库中)
那么,有可能获得生产优化代码的行号吗?是否需要其他编译器参数来获取它们?我不确定。通常,当函数是您自己代码的一部分时,
rdynamic
开关就足够了(在您的示例中,情况似乎就是这样)
您是否尝试过使用-fno内联函数-fno内联函数调用一次-fno优化同级调用进行编译?它在分析优化程序时非常有用。也许它也能帮助你解决问题
(边注:调用<代码> ADDR2Loe<代码> > <代码> -c>代码>激活激活DeangLink,这是因为您使用C++时推荐的。
< P>我不确定。通常,当函数是您自己代码的一部分时,rdynamic
开关就足够了(在您的示例中,情况似乎就是这样)
您是否尝试过使用-fno内联函数-fno内联函数调用一次-fno优化同级调用进行编译?它在分析优化程序时非常有用。也许它也能帮助你解决问题
(边注:调用<代码> ADDR2Leal/<代码>使用<代码> -c>代码>激活激活DeangLink,这是因为您使用C++。)
可能,但可能不多。
您必须理解,的目标是修改代码以使其更好(通过某种度量);而更改意味着生成的代码可能不会在以后有意义地映射到源代码
一些例子:
- 死代码消除等将删除现有代码,这主要影响在给定源代码行放置断点的尝试,因为该行可能没有代码
- 公共子表达式消除将创建新的临时变量,以便只计算一次子表达式;这些子表达式可能最初出现在贯穿源代码的多个表达式中,因此新指令属于多行。。。或者根本没有
- 不变提升或循环旋转将改变表达式与原始源代码相比的计算顺序,以便您可以看到在第3行、第6行、第4行、第5行、第7行执行的代码
- 循环展开将多次复制/粘贴循环体
当然,这些都是局部函数,你也必须考虑到
- 函数内联将在调用站点复制粘贴函数体
- 函数合并将采用两个不同的函数并删除其中一个,将其调用转发给另一个(当然,因为它们具有相同的行为)
毕竟,从源代码的角度尝试和推理是否有意义?不,不是真的。当然,我甚至没有考虑到这样一个事实:所有这些转换都发生在中间表示上,汇编代码的最终发布将使事情变得更加混乱(强度降低,是的!)
老实说,即使addr2line
给了你一些行,我也会怀疑它的结果。。。那么,首先问这个问题有什么意义呢?这可能是可能的,但可能没有多大意义
您必须理解,的目标是修改代码以使其更好(通过某种度量);而更改意味着生成的代码可能不会在以后有意义地映射到源代码
一些例子:
- 死代码消除等将删除现有代码,这主要影响在给定源代码行放置断点的尝试,因为该行可能没有代码
- 公共子表达式消除将创建新的临时变量,以便只计算一次子表达式;这些子表达式可能最初出现在贯穿源代码的多个表达式中,因此新指令属于多行。。。或者根本没有
- 不变提升或循环旋转将改变表达式与原始源代码相比的计算顺序,以便您可以看到在第3行、第6行、第4行、第5行、第7行执行的代码
- 循环展开将多次复制/粘贴循环体
当然,这些都是局部函数,你也必须考虑到
- 函数内联将在调用站点复制粘贴函数体
- 函数合并将采用两个不同的函数并删除其中一个,将其调用转发给另一个(当然,因为它们具有相同的行为)
毕竟,从源代码的角度尝试和推理是否有意义?不,不是真的。当然,我甚至没有考虑到这样一个事实:所有这些转换都发生在中间表示上,汇编代码的最终发布将使事情变得更加混乱(强度降低,是的!)
老实说,即使addr2line
给了你一些行,我也会怀疑它的结果。。。那么,首先询问的目的是什么呢?通常是的,但优化代码中的代码行和指令行之间没有严格的1:1关系,因此某些位置可能无法检索,因为它们已经不存在了。通常是的,但