2010-05-18 48 views
3

我在GDB中遇到了一些麻煩。我已經在ffmpeg庫中構建了一個示例程序,其中帶有調試符號並剝離。儘管我將ffmpeg庫配置爲static並顯式禁用共享,但它看起來像我正在調試的程序是動態鏈接的,因爲它的文件大小僅爲99kB。我不知道這是問題,但想到提及它。在Emacs GDB中逐步完成

在我設置並在av_seek_frame中創建斷點後,我使用'next'命令來逐步完成。但是,這將進入av_seek_frame()中的第一個函數,如下所示。此外,如果第二個「下一個」做了,那麼回溯失去了跟蹤它的位置。我錯了嗎?我怎樣才能跨過?我應該注意到我仔細檢查了那一步設置模式關'關閉作爲默認的(因爲我相信這將在第一段代碼沒有調試信息打破。)

Breakpoint 1, av_seek_frame (s=0x16429000, stream_index=0, timestamp=29727438, flags=0) at l 
(gdb) list 
1648 
1649  return 0; 
1650 } 
1651 
1652 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags 
1653 { 
1654  int ret; 
1655  AVStream *st; 
1656 
1657  ff_read_frame_flush(s); 
(gdb) next 
ff_read_frame_flush (s=0x16429000) at libavformat/utils.c:1248 
(gdb) list 
1243 
1244 /** 
1245  * Flush the frame reader. 
1246  **/ 
1247 void ff_read_frame_flush(AVFormatContext *s) 
1248 { 
1249  AVStream *st; 
1250  int i, j; 
1251 
1252  flush_packet_queue(s); 
(gdb) next 
ff_read_frame_flush (s=0x16429000) at libavformat/utils.c:1252 
(gdb) where 
#0 ff_read_frame_flush (s=0x16429000) at libavformat/utils.c:1252 
#1 0x00000000 in ??() 
+0

你是用'-fomit-frame-pointer'構建的嗎? – 2010-05-18 19:06:57

+0

我不這麼認爲,但它可能是因爲我在基於unix風格配置的構建中不太舒服。我的配置選項(構建ffmpeg庫和我正在調試的ffplay示例是:) ./configure --enable-libmp3lame --enable-static --enable-pthreads --enable -ffplay --disable-shared - - 禁用 - 優化 - 禁用 - mmx - 禁用 - 剝離 - 啓用 - 調試 – 2010-05-18 19:08:37

+0

嘗試檢查'show step-mode' - 我不使用emacs,所以不確定它的默認值是什麼。 – 2010-05-18 19:19:47

回答

1

如果你不知道您的二進制文件是否被靜態鏈接,你可以用LDD檢查,並看到這樣的消息:

% ldd ffmpeg 
     not a dynamic executable 

接下來,確保你給讓你不小心用gdb可執行的完整路徑選擇安裝在你的PATH系統中其他地方的二進制文件。

很可能你正在加載錯誤的二進制文件。即使沒有使用--disable-stripping和--disable-優化我可以使用gdb罰款使用stepnext命令。你不需要使用--disable-stripping,因爲在gdb裏你可以使用ffmpeg_g二進制文件(或者如果你碰巧運行ffmpeg二進制文件,你可以使用file ffmpeg_g從它加載符號)。

出於調試的目的,使用--disable-optimizations是很好的,因此在檢查變量時不會得到value optimized out,但嚴格來說,您不需要使用該選項來獲取emacs/gdb的行爲。 ..使用優化時,我沒有遇到任何問題。

有一點需要記住,但是,在Emacs中設置gud/gdb時可能會導致混淆的斷點:gud-break命令僅使用文件名的基本部分來設置斷點,而不是絕對路徑對於ffmpeg來說,這意味着如果你在utils.c中設置了一個斷點,它可能無法正常工作,具體取決於你在gdb中設置的源代碼搜索路徑的值,因爲ffmpeg有多個文件在不同的路徑中命名爲utils.c(實際上,總共有5個utils.c文件,每個lib *子目錄中有一個)。默認情況下,搜索路徑設置爲$ cdir:$ cwd,但是如果將其設置爲/ path/to/ffmpeg:$ cdir:$ cwd,並且您嘗試在libavformat的utils.c中設置斷點,它可能在libavutil中找到一個 - 在這種情況下,如果你幸運的話,它會抱怨你想要設置斷點的行不存在(因爲libavutil中的那個行較短),或者它可能會設置一個斷點你想要的行,但在錯誤的utils.c。

gud/gdb的這個問題應該被認爲是一個錯誤。當我得到片刻時,我會提交gud-break/gud-format-command的補丁來解決這個問題。