C++ 瓦尔格林赢得';t返回源代码行!

C++ 瓦尔格林赢得';t返回源代码行!,c++,debugging,valgrind,C++,Debugging,Valgrind,我曾尝试在我编写的应用程序上运行valgrind(memcheck和massif),但我得到的只是执行的函数的地址 --------------------------------- Context accounted for 0.6% of measured spacetime 0x805F29A: (within prog_name) 0x8141740: (within prog_name) Called from: 0.6% : 0x812E077: (within p

我曾尝试在我编写的应用程序上运行valgrind(memcheck和massif),但我得到的只是执行的函数的地址

---------------------------------
Context accounted for  0.6% of measured spacetime
  0x805F29A: (within prog_name)
  0x8141740: (within prog_name)

Called from:
   0.6% : 0x812E077: (within prog_name)

---------------------------------
Context accounted for  0.5% of measured spacetime
  0x805F29A: (within prog_name)
  0x81418FB: (within prog_name)

Called from:
   0.5% : 0x812E077: (within prog_name)
我用-g标志编译了我的应用程序,将调试符号放入其中valgrind没有显示源代码行还有其他原因吗?


编辑:valgrind版本3.2.1-Debian;g++4.3.1

我想,您没有提到正确的标志,而是使用默认标志

--show reachable是一个应该启用的标志,请查看其他标志并启用它们


--干杯

我发现我在编译时将
-g
-ggdb
标志都传递给了
g++
。忽略
-g
标志导致此问题消失。

可能有以下几个原因:

  • 您可能无意中剥离了可执行文件(最有可能的解释)
  • 您可能正在执行JITted代码(尽管地址看起来不是这样)
file prog\u name
说了什么?如果上面写着“脱光”,那就是个问题。您可能还需要检查其他工具(例如GDB)是否知道地址0x805F29A处的符号:

gdb prog_name
(gdb) info symbol 0x805F29A

对于其他有类似问题的读者(我有相同的编译器选项,但其中ok): 事实证明valgrind需要可执行文件的路径,如果您不提供该路径,那么它将正常运行,但不会提供行号。在我的例子中,可执行文件位于不同的目录中,该目录位于我的路径中,但为了获得行信息,我必须运行


valgrind--leak check=full path_to_myprogram/myprogram

不确定,但是如果您
gdb prog_name
您的应用程序并尝试类似于
break 0x812E077
的操作,那么
gdb
是否显示行号?(你甚至不需要
运行
程序,只要让
gdb
加载即可。)@aschepler-试过了。每当我尝试这样做时,gdb都找不到名为“0x812E077”的函数,并询问它是否位于稍后将加载的库中。。。所以那没用。哎呀,那应该是
break*0x812E077
。但很高兴你找到了解决办法。不过我没意识到我可以在gdb中做到这一点。谢谢你的提示!我从来没有收到一条短信。我不确定,但我怀疑混合了“-g”和“-ggdb”标志会把事情搞砸。@sheepsimulator您可以怀疑所有您想要的,但如果您希望我们帮助您,请提供我们要求的信息:“文件程序名”到底说了什么?GDB'info symbol'到底说了什么?我很感谢您的支持,但是当我在编译时省略了-g标志时,这个问题就消失了。我认为我的问题得到了回答。