Valgrind(主要下面),如何获得完整的堆栈跟踪?

时间:2012-06-16 16:39:53

标签: c debugging gdb stack-trace valgrind

我有来自valgrind的以下堆栈跟踪。但它并没有给我完整的堆栈跟踪。

==2433== Invalid free() / delete / delete[] / realloc()
==2433==    at 0x402B06C: free (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==2433==    by 0x43F345B: av_freep (mem.c:172)
==2433==    by 0x5A6F4D2: (below main) (libc-start.c:226)

在gdb中,我认为我得到了同样的错误:

#5  0xb7c1345c in av_free (ptr=<optimized out>) at libavutil/mem.c:172
#6  av_freep (arg=0x88a2e48) at libavutil/mem.c:181
#7  0xb7c165c8 in av_opt_free (obj=0x88a2ba0) at libavutil/opt.c:787
#8  0xb6b56efc in avcodec_close (avctx=0x88a2ba0) at libavcodec/utils.c:1675
#9  0x0808a3e0 in encode_lavc_finish (ctx=0x8343a40) at encode_lavc.c:288
#10 0x08077d0b in exit_player_with_rc (mpctx=0x8313058, how=EXIT_EOF, rc=0)
at mplayer.c:705
#11 0x0806ced0 in main (argc=8, argv=0xbffff374) at mplayer.c:4771 

但是gdb跟踪一直到main()

如何在valgrind中获得完整的堆栈跟踪,是否可能?

1 个答案:

答案 0 :(得分:3)

  

在gdb中,我认为我得到了同样的错误

您在GDB中没有收到错误。您在av_free上有一个断点,但肯定av_free被称为 lot ,并且您没有提供任何证据表明此特定调用是触发Valgrind错误的那个。< / p>

av_free的某些其他调用很可能实际上是在触发Valgrind错误,并且很可能该调用是从atexit处理程序执行的, Valgrind堆栈实际上是一个完整的堆栈跟踪。

如果您使用的是最新版本的Valgrind,您实际上可以使用--vgdb-error=1调试在Valgrind下运行的程序,并在发生问题时将GDB 完全附加。文档here