我有一个程序在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)不匹配。
应该匹配。要么你做错了什么(一定要准确地说出你在做什么),要么你在valgrindgdb中有一个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

09-15 23:37