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关系,因此某些位置可能无法检索,因为它们已经不存在了。通常是的,但