2016-12-15 149 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