gpt4 book ai didi

c - 如何查看程序在valgrind下运行时生成的core文件

转载 作者:太空宇宙 更新时间:2023-11-04 02:32:42 29 4
gpt4 key购买 nike

我有一个程序 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() 的原因。我正在尝试弄清楚如何从使用 GDB 所需的 myprog 加载符号。

如果我使用 file valgrind,那么这只会加载 valgrind 符号,而不会从 myprog

加载任何内容

如果我使用 file myprog,那么核心文件(由 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下运行时生成的core文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41174624/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com