c - 如何检查程序在valgrind下运行时生成的核心文件

标签 c gdb valgrind symbols core

我有一个程序myprog,我一直在 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,那么这只会加载 valgrind 符号,而不会从 myprog 加载任何内容

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

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

浏览 GDB documentation ,我猜我需要像 add-symbol-file filename address 这样的东西,但我不确定如何找出地址。

最佳答案

I'm trying to figure out how to load symbols from myprog necessary to use GDB.

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

If I use file myprog, then the corefile (generated by valgrind) won't match the executable (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 (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

关于c - 如何检查程序在valgrind下运行时生成的核心文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41174624/

相关文章:

c++ - 如何在 Mac OS X 上监视目录中的更改?

c++ - 严格的别名规则和 'char *' 指针

c - 二进制 * 的无效操作数(有 'char *' 和 'int *' )

c - Arduino serial.print() 在实际字符后添加一个额外的字符

c - 在docker下运行objdump显示不同的结果

c++ - Eclipse - 启动命令 : gdb --version 时出错

c++ - 使用 valgrind 查找 mysql c++ 客户端中的内存泄漏

c++ - 即使 valgrind 没有显示内存泄漏,我是否应该在 c++11 的析构函数中清除 unique_ptr 的 vector

debugging - Docker 内部的调试限制有哪些?

c++ - Valgrind : is there a memory leak in the output? 总结