C++ 瓦尔格林赢得';t返回源代码行!
我曾尝试在我编写的应用程序上运行valgrind(memcheck和massif),但我得到的只是执行的函数的地址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
---------------------------------
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标志时,这个问题就消失了。我认为我的问题得到了回答。