我有一个程序在valgrind下运行:
/usr/bin/valgrind --tool=massif --tool=memcheck --leak-check=yes --track-origins=yes --log-file=/tmp/valgrind%p /opt/bin/myprog
我不太清楚valgrind在封面下是如何工作的,但是当以这种方式运行时,我看到
myprog
有一个pid,但是valgrind
没有。因此,我假设valgrind在相同的进程空间中运行myprog
,并使用一些魔术来加载目标程序。myprog
似乎命中了一个myprog
并生成了一个corefile。我想使用GDB检查这个corefile,这样我就可以探究assert()
的原因了。我正试图找出如何从myprog加载使用GDB所必需的符号。如果我使用
assert()
,那么这只会加载valgrind符号,而不会从file valgrind
加载任何内容如果我使用
myprog
,那么核心文件(由valgrind生成)将与可执行文件(myprog)不匹配。我有没有办法告诉GDB,即使这里的“主机”进程是
file myprog
,我们也希望加载valgrind
符号,因为这是我们真正感兴趣的程序?通过查看GDB documentation,我想我需要一些类似
myprog
的东西,但我不确定如何找出地址。 最佳答案
我正试图找出如何从myprog加载使用GDB所必需的符号。
通常的方式是:gdb ./myprog vgcore.1234
。
如果我使用file myprog
,那么核心文件(由valgrind生成)将与可执行文件(myprog)不匹配。
应该匹配。要么你做错了什么(一定要准确地说出你在做什么),要么你在valgrind
或gdb
中有一个bug。
例子:
$ 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 (sig=sig@entry=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 (sig=sig@entry=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