2010-10-25 65 views
5

我试过在我编写的应用程序上运行valgrind(memcheck和massif),但是我得到的所有地址都是执行函数的地址。Valgrind不会返回源代码行!

--------------------------------- 
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

+1

不知道,但如果你'gdb prog_name'你的应用并尝试类似'break 0x812E077','gdb'显示行号? (你甚至不需要运行程序,只需要'gdb'加载它。) – aschepler 2010-10-25 21:48:22

+0

@aschepler - 试过了。每当我尝试这样做时,gdb找不到名为“0x812E077”的函数,并询问它是否在库中,稍后会加载......所以这没有奏效。 – 2010-10-25 22:23:48

+1

哎呀,那应该是'break * 0x812E077'。但很高兴你找到了解决办法。 – aschepler 2010-10-26 18:32:33

回答

8

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

1

我想,你没有提及正确的标志,并与默认标志。

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

--Cheers

2

有几个可能的原因:

  • 你可能无意中剥夺你的可执行文件(最有可能的解释),
  • 你可能正在执行实时编译的代码(尽管地址并不像这案子)。

file prog_name是什么意思?如果它说“剥离”,那就是一个问题。您可能还想检查是否有其他工具,例如GDB知道是在地址0x805F29A什么符号:

gdb prog_name 
(gdb) info symbol 0x805F29A 
+0

我从来没有得到一个剥离的消息。我不知道,但我怀疑混合'-g'和'-ggdb'标志会搞砸了。 – 2010-10-27 14:46:45

+0

@sheepsimulator你可以怀疑你想要的所有东西,但是如果你想让我们来帮助你,请提供我们要求的信息:*'prog_name'究竟有什么*确切*说? GDB的“信息符号”究竟是什么意思? – 2010-10-27 20:02:42

+0

我很欣赏你的支持,但是当我在编译时省略-g标志时,这个问题就消失了。我认为我的问题得到解答。 – 2010-10-27 22:07:23

1

对于其他读者类似的问题(我有同样的,但我的编译器选项,其中OK): 事实证明,Valgrind的需要可执行文件路径,如果你不要给这个,那么它会运行良好,但它不会给你行数。在我的情况下,可执行文件在不同的目录,这是在我的路径,但获得行信息我只好跑

的valgrind --leak检查=全path_to_myprogram/myprogram