ダイナミックリンクライブラリをgdbでデバッグする

2322 ワード

コンパイルのオプション
gdbを使ってデバッグする前に、コンパイルの実行可能なプログラムとデバッグしたいダイナミックライブラリのコンパイルには-gオプションが含まれていることを保証しなければなりません.ここにはもう一つのピットがあります.私たちは指定した-gをコンパイルしましたが、コンパイルが完了した後にstripコマンドを使ってデバッグ情報を除去しました.最終的なプログラムとライブラリもデバッグ情報がありません.この時もgdbデバッグはできません.
gdbデバッグコマンド
gdbを使って運転する場合は、次のコマンドを実行します.
gdb test
このコマンドはtestという実行可能なプログラムを実行します.もしライブラリが実行中に見つかったら、自然gdbは直接ダイナミックライブラリに飛び込んでデバッグできます.この時は普通の実行可能なプログラムと違いません.関数にジャンプしたい場合は、次のsステップコマンドを実行します.
b:    
n:    (     )
s:    (    )
以上はすべて理想的な情況の下で私達は完璧に自分のプログラムを調整することができて、いくつか高級な機能を紹介します.まず、ダイナミックライブラリが本機でコンパイルしたのではないと、gdbはsource codeの位置を探し出せないかもしれません.つまり、関数の運行状況を見ることができません.通常のデフォルトでは、1つのプログラムは本マシンでコンパイルすると、その中にsource codeの絶対的なパスが保存されます.このようにgdbローディングする時に、自然にどこにsource codeをローディングするか分かりますが、他のマシンからコンパイルされたライブラリはどうやってsource codeをロードすればいいですか?ここでは、source codeに関する命令を紹介します.まず、次の命令を利用して、gdbでsource codeを検索するルートを確認します.
(gdb) show dir
Source directories searched: /home/xiehaocheng/work/libmini-ipc:$cdir:$cwd
他のところからコピーしてきたlibraryなら、gdbのソースコードを検索するルートを設定できます.
(gdb) dir /home/xiehaocheng/work
Source directories searched: /home/xiehaocheng/work:/home/work:/home/work/sourcecode:/home/xiehaocheng/work/libmini-ipc:$cdir:$cwd
dirコマンドを使用すると自動的にsource code検索パスを追加し、複数のパスを追加することができます.これで正常にデバッグできます.
gdbプロファイル
上記のコマンドをそのまま使用してgdbデバッグを行う以外に、configファイルでデバッグする方法を紹介します.例えば本例:
 file /home/xiehaocheng/work/libmini-ipc/test/ipclib_test
 set solib-absolute-prefix /home/xiehaocheng/work/libmini-ipc/test/
 set solib-search-path /home/xiehaocheng/work/libmini-ipc/test/
 dir /home/xiehaocheng/work/libmini-ipc                                                                 
  • file
  • デバッグする実行可能プログラムを設定します.
  • dir
  • このプログラムに対応するコードディレクトリを設定します.
  • ソロib-absolution-prefix
  • ライブラリ検索のプレフィックスを設定します.このディレクトリには、必要なライブラリをtargetボード内の経路で配置する必要があります.rootdirに相当します.環境変数の設定の代わりにset sysrootを実行できます.
  • solib-search-path
  • この環境変数もgdbのためにsoライブラリを検索します.これはso lib-absoute-prefixの検索に失敗してから検索したディレクトリです.この環境変数を使用したいなら、上のsolib-absolution-prefixを無効なパスに設定して、gdbがhostシステムにインストールされているlibを探すのを防止します.私たちがデバッグしたいのは、ターゲットlibです.
    上記の内容をgdb.com figファイルに書き込んで、実行します.
    gdb -x gdb.config
    
    自動的にデバッグプログラムを実行して、solib-absolution-prefixとsolib-search-pathの位置から動的リンクライブラリを検索します.