• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Networking /C++/Linux

              C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              11 Posts :: 14 Stories :: 1 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(4)

            我參與的團隊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            用gdb調試動態鏈接庫

                大家都知道在 Linux 可以用 gdb 來調試應用程序,當然前提是用 gcc 編譯程序時要加上 -g 參數。

                我這篇文章里將討論一下用 gdb 來調試動態鏈接庫的問題。

                首先,假設我們準備這樣的一個動態鏈接庫:

                引用:

                庫名稱是: ggg

                動態鏈接庫文件名是: libggg.so

                頭文件是: get.h

                提供這樣兩個函數調用接口:

                 int get ();

                 int set (int a);

                

                要生成這樣一個動態鏈接庫,我們首先編寫這樣一個頭文件:

                /************關于本文檔********************************************

                *filename: get.h

                *********************************************************************/

                int get ();

                int set (int a);

                然后準備這樣一個生成動態鏈接庫的源文件:

                /************關于本文檔********************************************

                *filename: get.cpp

                *********************************************************************/

                #include

                #include "get.h"

                static int x=0;

                int get ()

                {

                 printf ("get x=%d\n", x);

                 return x;

                }

                int set (int a)

                {

                 printf ("set a=%d\n", a);

                 x = a;

                 return x;

                }

                然后我們用 GNU 的 C/C++ 編譯器來生成動態鏈接庫,編譯命令如下:

                引用:

                g++ get.cpp -shared -g -DDEBUG -o libggg.so

                這樣我們就準備好了動態鏈接庫了,下面我們編寫一個應用程序來調用此動態鏈接庫,源代碼如下:

                /************關于本文檔********************************************

                *filename: pk.cpp

                *********************************************************************/

                #include

                #include "get.h"

                int main (int argc, char** argv)

                {

                 int a = 100;

                 int b = get ();

                 int c = set (a);

                 int d = get ();

                 printf ("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d);

                 return 0;

                }

                編譯此程序用下列命令,如果已經把上面生成的 libggg.so 放到了庫文件搜索路徑指定的文件目錄,比如 /lib 或 /usr/lib 之類的,就用下面這條命令:

                引用:

                g++ pk.cpp -o app -Wall -g -lggg

                否則就用下面這條命令:

                引用:

                g++ pk.cpp -o app -Wall -g -lggg -L`pwd`

                下面我們就開始調試上面命令生成的 app 程序吧。如果已經把上面生成的 libggg.so 放到了庫文件搜索路徑指定的文件目錄,比如 /lib 或 /usr/lib 之類的,調試就順利完成,如下:

                引用:

                #gdb ./app

                GNU gdb 6.4-debian

                Copyright 2005 Free Software Foundation, Inc.

                GDB is free software, covered by the GNU General Public License, and you are

                welcome to change it and/or distribute copies of it under certain conditions.

                Type "show copying" to see the conditions.

                There is absolutely no warranty for GDB. Type "show warranty" for details.

                This GDB was configured as "i486-linux-gnu"...Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".

                (gdb) b main /* 這是在程序的 main 處設置斷點 */

                Breakpoint 1 at 0x804853c: file pk.cpp, line 7.

                (gdb) b set /* 這是在程序的 set 處設置斷點 */

                Function "set" not defined.

                Make breakpoint pending on future shared library load? (y or [n]) y /* 這里必須選擇 y 調試程序才會跟蹤到動態鏈接庫內部去 */

                Breakpoint 2 (set) pending.

                (gdb) run /* 開始運行我們的程序,直到遇見斷點時暫停 */

                Starting program: /data/example/c/app

                Breakpoint 3 at 0xb7f665f8: file get.cpp, line 11.

                Pending breakpoint "set" resolved

                Breakpoint 1, main (argc=1, argv=0xbf990504) at pk.cpp:7

                7 int a = 100;

                (gdb) n /* 繼續執行程序的下一行代碼 */

                8 int b = get ();

                (gdb) n /* 程序執行到了我們斷點所在的動態鏈接庫了 */

                get x=0

                9 int c = set (a);

                (gdb) n

                Breakpoint 3, set (a=100) at get.cpp:11

                11 printf ("set a=%d\n", a);

                (gdb) list /* 查看當前代碼行周圍的代碼,證明我們已經跟蹤到動態鏈接庫的源代碼里面了 */

                6 printf ("get x=%d\n", x);

                7 return x;

                8 }

                9 int set (int a)

                10 {

                11 printf ("set a=%d\n", a);

                12 x = a;

                13 return x;

                14 }

                (gdb) n

                set a=100

                12 x = a;

                (gdb) n

                13 return x;

                (gdb) n

                14 }

                (gdb) n

                main (argc=1, argv=0xbf990504) at pk.cpp:10

                10 int d = get ();

                (gdb) n

                get x=100

                11 printf ("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d);

                (gdb) n

                a=100,b=0,c=100,d=100

                12 return 0;

                (gdb) c

                Continuing.

                Program exited normally.

                (gdb) quit /* 程序順利執行結束 */

                如果我們沒有把動態鏈接庫放到指定目錄,比如/lib里面,調試就會失敗,過程如下:

                引用:

                # gdb ./app

                GNU gdb 6.4-debian

                Copyright 2005 Free Software Foundation, Inc.

                GDB is free software, covered by the GNU General Public License, and you are

                welcome to change it and/or distribute copies of it under certain conditions.

                Type "show copying" to see the conditions.

                There is absolutely no warranty for GDB. Type "show warranty" for details.

                This GDB was configured as "i486-linux-gnu"...Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".

                (gdb) b main

                Breakpoint 1 at 0x804853c: file pk.cpp, line 7.

                (gdb) b set

                Function "set" not defined.

                Make breakpoint pending on future shared library load? (y or [n]) y

                Breakpoint 2 (set) pending.

                (gdb) run /* 雖然調試操作都一樣,但程序執行失敗 */

                Starting program: /data/example/c/app

                /data/example/c/app: error while loading shared libraries: libggg.so: cannot open shared object file: No such file or directory

                Program exited with code 0177.

                (gdb) quit
            http://os.chinaunix.net/a2007/0830/976/000000976152.shtml

            posted on 2011-12-15 10:56 likun 閱讀(455) 評論(0)  編輯 收藏 引用 所屬分類: DEBUG
            久久精品国产亚洲AV高清热 | 久久久久高潮综合影院| 青青草原1769久久免费播放| 久久99精品久久久久久水蜜桃| 国产午夜精品久久久久九九电影| 青青热久久国产久精品 | 91精品国产91久久久久久青草 | 99久久99久久精品免费看蜜桃| 青青草国产成人久久91网| 欧美久久久久久精选9999| 无码人妻久久一区二区三区蜜桃| 久久99国产综合精品女同| 日日狠狠久久偷偷色综合96蜜桃| 欧洲成人午夜精品无码区久久| 色综合久久中文色婷婷| 欧美一区二区三区久久综合| 久久久久亚洲爆乳少妇无| 日本欧美久久久久免费播放网| 久久青青草原精品国产软件| 97久久久久人妻精品专区| 一级女性全黄久久生活片免费 | 国内精品综合久久久40p| 久久国产午夜精品一区二区三区| 久久综合给合久久狠狠狠97色69| 亚洲?V乱码久久精品蜜桃| 26uuu久久五月天| 九九久久99综合一区二区| 漂亮人妻被黑人久久精品| 久久久久久精品免费看SSS | 久久亚洲AV无码西西人体| 国产成人久久激情91| 99久久人妻无码精品系列| 久久精品成人欧美大片| 99精品国产免费久久久久久下载| 国产成人久久精品麻豆一区 | 欧美成人免费观看久久| 久久这里只有精品视频99| 欧美精品丝袜久久久中文字幕| 精品人妻伦一二三区久久| 久久久久免费视频| 久久久久99这里有精品10 |