【问题标题】:Valgrind (below main), how to get full stack trace?Valgrind(在 main 下面),如何获得完整的堆栈跟踪?
【发布时间】:2012-06-16 16:39:52
【问题描述】:

我有以下来自 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 中获取完整的堆栈跟踪,是否有可能?

【问题讨论】:

标签: c debugging gdb stack-trace valgrind


【解决方案1】:

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

您没有在 GDB 中收到 错误。你在av_free 上有一个断点,但av_free 肯定被称为很多,而且你没有提供任何证据表明这个特定的调用是触发 Valgrind 错误的那个。

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

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

【讨论】:

  • 是的,我刚刚发现附加了一个调试器。还要感谢@Vincenzo 向我指出了常见问题解答。附加 gdb 时,堆栈跟踪与使用不带 valgrind 的 gdb 完全相同。
猜你喜欢
  • 2020-12-03
  • 2022-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-16
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多