1

これは、数週間前に参加して以来、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"
4

2 に答える 2

0

あなたが説明したgdbの問題がlibexpatの欠如によって引き起こされているかどうか、私は自分の仕事でチェックしました。そして、これが事実のようです:)最初にexpatをコンパイルしてインストールし、次にソースからgdbをコンパイルしてみてください。以下のものを必ず用意してください。

checking for libexpat... yes
checking how to link with libexpat... <some_path>/libexpat.a

ログに(「./configure」の後ではなく、「make」コマンドの後のどこかに)。

gdb をコンパイルするには、Windows 7 および gdb-7.5 ソースで MinGW の gcc 4.6.2 を使用しました。また、2 つの追加の構成フラグも追加しましたが、それらは必須ではありません。

./configure --with-python --without-auto-load-safe-path 
于 2012-08-23T09:07:40.983 に答える
0

この問題に対する答えはありませんが、解決策を見つけるのに役立つ手がかりがいくつかあります。

私はそれが NetBeans のせいではないと信じています。それはgdbの何かです。おそらく、いくつかの特別な構成フラグを使用してコンパイルする必要があります。

Windows 7でNetBeans 7.0-7.2およびEclipse Junoでgdb 7.4(MinGWで少し前にダウンロード)を使用していましたが、すべてが期待どおりに機能していました-ライブラリ(静的または動的)にブレークポイントを入力するとgdbが停止しました。

最近、Eclipse で複雑な STL 構造をきれいに印刷するために、Python サポートでコンパイルされた gdb に移行したいと考えていました。そこで、最新の gdb 7.5 ソースをダウンロードし、「--with-python」フラグを付けてコンパイルしました。

./configure --with-python
make && make install

かなりかわいらしい作品。Eclipse ではなく、NetBeans でも同様です (プロジェクトのデバッグ設定で .gdbinit ファイルを指定するだけで済みます)。問題は、私自身がコンパイルしたバージョンの gdb には、ライブラリ (NetBeans 7.2 および Eclipse Juno) のブレークポイントで停止する機能がないことです。

私の結論は、この機能を得るには、いくつかのフラグを指定して gdb をコンパイルする必要があるということです。または、いくつかのフラグを付けて実行するだけで十分かもしれません。また、この問題についてお役に立てれば幸いです。

私はいくつかの有用な情報を添付しています:

gdb 7.4 での正しいスタック トレースのスクリーンショット

gdb 7.5 のスタック トレースが正しくないスクリーンショット

正しい gdb:

C:\MinGW\bin>gdb  --version
GNU gdb (GDB) 7.4
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-pc-mingw32".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.

C:\MinGW\bin>gdbserver --version
GNU gdbserver (GDB) 7.4
Copyright (C) 2012 Free Software Foundation, Inc.
gdbserver is free software, covered by the GNU General Public License.
This gdbserver was configured as "i686-pc-mingw32"

不正な gdb:

C:\MinGW\bin>gdb --version
GNU gdb (GDB) 7.5
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-pc-mingw32".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.

C:\MinGW\bin>gdbserver --version
GNU gdbserver (GDB) 7.5
Copyright (C) 2012 Free Software Foundation, Inc.
gdbserver is free software, covered by the GNU General Public License.
This gdbserver was configured as "i686-pc-mingw32"
于 2012-08-21T21:58:52.577 に答える