簡體   English   中英

跨過Emacs GDB

[英]Stepping Over in Emacs GDB

我在GDB中遇到了一些麻煩。 我已經在ffmpeg庫中構建了一個示例程序,其中包含調試符號並將其剝離。 雖然我將ffmpeg庫配置為靜態並顯式禁用了共享,但看起來我正在調試的程序是動態鏈接的,因為它的文件大小只有99kB。 我不知道這是問題,但想提一下。

在av_seek_frame中設置並命中斷點后,我使用'next'命令跳過。 但是,這將進入av_seek_frame()中的第一個函數,如下所示。 此外,如果做第二個“下一個”,則回溯將無法跟蹤它的位置。 我設置錯了嗎? 我怎么能跨過去? 我應該注意,我仔細檢查了'set step-mode off'是默認關閉的(因為我相信這會在沒有調試信息的第一段代碼中斷開。)

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 ?? ()

如果您不確定您的二進制文件是否是靜態鏈接的,可以使用ldd進行檢查並查看如下消息:

% ldd ffmpeg
        not a dynamic executable

接下來,請確保為gdb提供可執行文件的完整路徑,這樣您就不會意外地在系統中的其他位置安裝二進制文件。

很可能你加載了錯誤的二進制文件。 即使使用--disable-stripping和--disable-optimizations,我也可以使用stepnext命令來使用gdb。 您不需要使用--disable-stripping,因為在gdb中您可以使用ffmpeg_g二進制文件(或者如果您碰巧運行ffmpeg二進制file ffmpeg_g ,則可以使用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的這個問題應該被視為一個bug。 當我得到片刻時,我將提交gud-break / gud-format-command的補丁來解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM