2016-12-15 152 views
1

运行时检查生成的核心文件我有一个程序myprog这是我一直的valgrind下运行:如何计划下的valgrind

/usr/bin/valgrind --tool=massif --tool=memcheck --leak-check=yes --track-origins=yes --log-file=/tmp/valgrind%p /opt/bin/myprog 

我不知道到底要怎样的valgrind下工作的细节但是当以这种方式运行时,我看到valgrind有一个pid,但是myprog没有。因此,我认为valgrind在相同的进程空间运行myprog,并使用一些魔法来加载目标程序。

myprog似乎已经命中assert()并且已生成核心文件。我想使用GDB来检查这个核心文件,所以我可以深入探究assert()的原因。我试图弄清楚如何从myprog中加载符号来使用GDB。

如果我使用file valgrind,那么这只是如果我使用file myprog,则核心文件(通过Valgrind的产生)将不匹配的可执行文件(MYPROG)加载的valgrind符号和myprog

什么。

有什么方法可以告诉GDB,尽管这里的“主机”过程是valgrind,我们也想加载myprog符号,因为这是我们真正感兴趣的程序吗?

通过GDB documentation翻看,我猜我需要类似add-symbol-file filename address,但我不知道如何找出地址是什么。

回答

2

我想弄清楚如何从myprog中加载符号来使用GDB。

通常的方法:gdb ./myprog vgcore.1234

如果我使用file myprog,那么核心文件(由valgrind生成)将不匹配可执行文件(myprog)。

应该匹配。要么你做错了什么(确实告诉究竟是你在做什么),或者你有一个错误valgrindgdb

例子:

$ cat foo.c 
int foo() { abort(); } 
int bar() { return foo(); } 
int main() { return bar(); } 

$ gcc -g -w foo.c 
$ valgrind ./a.out 

==84263== Using Valgrind-3.9.0.SVN and LibVEX; rerun with -h for copyright info 
==84263== Command: ./a.out 
==84263== 
==84263== 
==84263== HEAP SUMMARY: 
==84263==  in use at exit: 0 bytes in 0 blocks 
==84263== total heap usage: 0 allocs, 0 frees, 0 bytes allocated 
... 

$ ls -lrt 
total 2116 
-rw-r----- 1 er eng  80 Dec 15 20:18 foo.c 
-rwxr-x--- 1 er eng 9558 Dec 15 20:21 a.out 
-rw------- 1 er eng 4243434 Dec 15 20:21 vgcore.84263 

$ gdb -q ./a.out vgcore.84263  
Reading symbols from ./a.out...done. 
[New LWP 84263] 
Core was generated by `'. 
Program terminated with signal SIGABRT, Aborted. 
#0 0x0000000004a5bc37 in __GI_raise ([email protected]=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 
56 ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory. 
(gdb) bt 
#0 0x0000000004a5bc37 in __GI_raise ([email protected]=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 
#1 0x0000000004a5f028 in __GI_abort() at abort.c:89 
#2 0x0000000000400536 in foo() at foo.c:1 
#3 0x0000000000400544 in bar() at foo.c:2 
#4 0x0000000000400554 in main() at foo.c:3 
+0

是的,你是绝对正确的。我在Ubuntu下获得与您类似的简单测试可执行文件相同的结果。不幸的是,我所拥有的系统是一个专有的嵌入式(基于Linux)系统,其中包含有趣的GDB封装和一些额外的核心和口哨,用于其核心设备。我将不得不深入研究... –

+0

请注意,您也可以使用gdb + vgdb来调试在Valgrind下运行的应用程序(请参阅http://www.valgrind.org/docs/manual/manual-core-adv html的#手动芯adv.gdbserver)。附注:您在命令行中指定了2个工具,但只有一个将被激活。 – phd