5

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で完全なスタックトレースを取得するにはどうすればよいですか?

4

1 に答える 1

4

gdbでは、同じエラーが発生すると思います

GDBでエラーは発生しませんでした。にブレークポイントがありますがav_free、確かにたくさんav_free呼び出されており、この特定の呼び出しがValgrindエラーをトリガーする呼び出しであるという証拠は提供されていません。

他の呼び出しav_freeが実際にValgrindエラーをトリガーしている可能性が非常に高く、その呼び出しがハンドラーから実行されている可能性も非常に高く、atexitValgrindスタックは実際には完全なスタックトレースです。

Valgrindの最新バージョンを使用している場合は、Valgrindで実行されているプログラムを実際にデバッグし、問題が発生した場所に--vgdb-error=1GDBを正確にアタッチできます。ここのドキュメント。

于 2012-06-16T19:24:11.270 に答える