これは、数週間前に参加して以来、StackOverflow での最初の質問です。誰かがこの問題に光を当ててくれたらいいのにと思います。既に Web で検索しましたが、この問題に対する有効な解決策が見つかりません。
GNU GDB を使用して Mac OSX 10.5.8 (Leopard) で Netbeans 7.1 をデバッグする際に問題が発生しています。私の問題は、デバッガーがそのライブラリのソース コードに設定されたブレークポイントで停止しないため、テスト アプリケーションから独自の静的ライブラリまたは動的ライブラリを簡単にデバッグできないことです。ただし、ライブラリ関数に「ステップイン」できることに気付きました。ライブラリ関数に入ると、それらの関数のブレークポイントが起動します!
私のテストベンチは、「mylib」(C スタティック ライブラリ) と「mylib-test」(C アプリケーション) の 2 つの単純なプロジェクトで構成されています。「mylib」には、関数を定義するヘッダーと ac ファイルが含まれているだけです。
int sum(int a, int b) {
return a+b;
}
一方、mylib-test ソースは単純にその関数を使用します。
int main(int argc, char** argv) {
printf("Result=%d\n", sum(111, 222));
return (EXIT_SUCCESS);
}
両方のプロジェクトが正常にコンパイルおよび実行されます。便宜上、両方のプロジェクトをコンパイル/リンクした結果を以下に示します。
mylib のコンパイルの出力:
gcc -c -g -MMD -MP -MF build/Debug/GNU-MacOSX/m.o.d -o build/Debug/GNU-MacOSX/m.o m.c
mkdir -p dist/Debug/GNU-MacOSX
rm -f dist/Debug/GNU-MacOSX/libmylib.a
ar -rv dist/Debug/GNU-MacOSX/libmylib.a build/Debug/GNU-MacOSX/m.o
ar: creating archive dist/Debug/GNU-MacOSX/libmylib.a
a - build/Debug/GNU-MacOSX/m.o
ranlib dist/Debug/GNU-MacOSX/libmylib.a
mylib-test のコンパイルの出力:
gcc -c -g -I../mylib -MMD -MP -MF build/Debug/GNU-MacOSX/main.o.d -o build/Debug/GNU-MacOSX/main.o main.c
mkdir -p dist/Debug/GNU-MacOSX
gcc -o dist/Debug/GNU-MacOSX/mylib-test build/Debug/GNU-MacOSX/main.o ../mylib/dist/Debug/GNU-MacOSX/libmylib.a
デバッガー コンソールを調べると、デバッガーにアプリケーションをロードすると、ライブラリのソース コードに配置されたブレークポイントが "PENDING" としてマークされていることがわかりました ( 12^doneで始まる行、フィールドaddrを参照)。
11-break-insert -f "/Users/claudi/dev/mylib-test/main.c:16"
12-break-insert -f "/Users/claudi/dev/mylib/m.c:5"
7^done,line="7",file="main.c",fullname="/Users/claudi/dev/mylib-test/main.c",time={wallclock="0.00065",user="0.00032",system="0.00029",start="1345544547.505531",end="1345544547.506184"}
(gdb)
13-break-insert -t main
&"cd /Users/claudi/dev/mylib-test\n"
8^done
(gdb)
9^done,time={wallclock="0.00002",user="0.00002",system="0.00000",start="1345544547.530991",end="1345544547.531013"}
(gdb)
&"set environment DYLD_LIBRARY_PATH=../mylib/dist/Debug/GNU-MacOSX\n"
10^done
(gdb)
11^done,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x00001fb3",func="main",file="main.c",line="16",shlib="/Users/claudi/dev/mylib-test/dist/Debug/GNU-MacOSX/mylib-test",times="0"},time={wallclock="0.00058",user="0.00030",system="0.00029",start="1345544547.532421",end="1345544547.533003"}
(gdb)
12^done,bkpt={number="2",type="breakpoint",disp="keep",enabled="y",addr="<PENDING>",pending="/Users/claudi/dev/mylib/m.c:5",times="0"},time={wallclock="0.00040",user="0.00018",system="0.00022",start="1345544547.533140",end="1345544547.533542"}
(gdb)
13^done,bkpt={number="3",type="breakpoint",disp="del",enabled="y",addr="0x00001fb3",func="main",file="main.c",line="16",shlib="/Users/claudi/dev/mylib-test/dist/Debug/GNU-MacOSX/mylib-test",times="0"},time={wallclock="0.00017",user="0.00016",system="0.00001",start="1345544547.552190",end="1345544547.552362"}
GDB はライブラリのシンボルをロードしていないように見えますが、実際には静的にリンクされています (つまり、ロードする動的ライブラリがありません)!! ただし、関数sum
から関数にステップmain()
インしてブレークポイントを配置すると、正常に解決されます。
21-break-insert -f "/Users/claudi/dev/mylib/m.c:5"
21^done,bkpt={number="4",type="breakpoint",disp="keep",enabled="y",addr="0x00001fea",func="sum",file="m.c",line="5",shlib="/Users/claudi/dev/mylib-test/dist/Debug/GNU-MacOSX/mylib-test",times="0"},time={wallclock="0.00099",user="0.00039",system="0.00060",start="1345544947.877096",end="1345544947.878088"}
十分な情報を提供できたと思います...何が起こっているのか知っている人はいますか? 前もって感謝します!
詳細情報:
GCC バージョン: 686-apple-darwin9-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. ビルド 5577)
GDB バージョン: GNU gdb 6.3.50-20050815 (Apple バージョン gdb-967)
Netbeans バージョン: 7.1 (ビルド 201112071828)
//////////////編集///////////////////////////////// ///////////////
これまでのところ、問題は GDB にあると考えていましたが、今日、そうではないことに気付きました。コマンド ラインから GDB を使用してアプリケーションを直接デバッグできました。つまり、sum
関数とデバッガにブレークポイントを設定できました。関数に足を踏み入れる必要なく、それらに立ち止まりました。したがって、NetBeans が GDB を開始/初期化する方法に問題があると確信しています。また、NetBeans が GDB から機能を取得しようとして成功していないことにも気付きました。デバッガー コンソールから:
~"GNU gdb 6.3.50-20050815 (Apple version gdb-967) (Tue Jul 14 02:11:58 UTC 2009)\n"
~"Copyright 2004 Free Software Foundation, Inc.\n"
~"GDB is free software, covered by the GNU General Public License, and you are\nwelcome
to change it and/or distribute copies of it under certain conditions.\nType \"show
copying\" to see the conditions.\nThere is absolutely no warranty for GDB. Type \"show
warranty\" for details.\n"
~"This GDB was configured as \"i386-apple-darwin\"."
~"\n"
(gdb)
2-list-features
3-gdb-set print repeat 0
4-gdb-set backtrace limit 1024
5-gdb-set print elements 0
6-file-exec-and-symbols "/Users/claudi/dev/mylib-test/dist/Debug/GNU-MacOSX/mylib-test"
2^error,msg="Undefined MI command: list-features"