- ベストアンサー
gdbで無名名前空間の関数にブレイクポイント
Windows+cygwin+emacsでc++のプログラムを勉強しています。デバッガとしてemacs上でgdbを使っているのですが、無名の名前空間にある関数にブレイクポイントを設定する方法がわかりません。例えば、 namespace { void foo() { ... } } int main(void) { foo(); } のようなfoo.cppファイルをコンパイルしてfoo.exeファイルを作り、それをgdbによりデバッグするとします。そこで、gdb上で b main とすると、mainに入ったところにブレイクポイントが設定されますが、 b foo としても、Function "foo" not defined.と表示されてブレイクポイントが設定されません。無名の名前空間にある関数にはどのように入力してブレイクポイントを設定するのでしょうか。とりあえず、今は行番号によりブレイクポイントを設定しています。ご存じの方がいらっしゃいましたら、ご教授ください。お願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
一番良い方法かどうかはわかりませんが、 b foo.cpp:foo でブレークポイントを設定することが出来ました。 ちなみに、各バージョンは cpp (GCC) 3.4.4 (cygming special) gdb 6.5.50.20060706-cvs (cygwin-special) です。
その他の回答 (1)
- hi-mi-tsu
- ベストアンサー率12% (1/8)
cygwinはあまり分からないのですが、多分これでいいのかと思います。 % g++ -g foo.cpp % nm a.exe # シンボル一覧を見てみる。 08049530 d _DYNAMIC 08049614 d _GLOBAL_OFFSET_TABLE_ 08048514 R _IO_stdin_used w _Jv_RegisterClasses 080483c4 T _ZN36_GLOBAL__N_foo.cpp_00000000_DF1B9ED13fooEv 08049520 d __CTOR_END__ 0804951c d __CTOR_LIST__ 08049528 d __DTOR_END__ 08049524 d __DTOR_LIST__ 08048518 r __FRAME_END__ 0804952c d __JCR_END__ 0804952c d __JCR_LIST__ 08049634 A __bss_start 08049628 D __data_start 080484c0 t __do_global_ctors_aux 08048370 t __do_global_dtors_aux 0804962c D __dso_handle 0804951c a __fini_array_end 0804951c a __fini_array_start w __gmon_start__ U __gxx_personality_v0@@CXXABI_1.3 0804951c a __init_array_end 0804951c a __init_array_start 08048460 T __libc_csu_fini 080483f0 T __libc_csu_init U __libc_start_main@@GLIBC_2.0 08049634 A _edata 08049638 A _end 080484f4 T _fini 08048510 R _fp_hw 080482d8 T _init 08048320 T _start 08048344 t call_gmon_start 08049634 b completed.5513 08049628 W data_start 080483a0 t frame_dummy 080483ca T main 08049630 d p.5511 % nm a.out | grep foo # ちょっと多いので、怪しそうなのを探してみる 080483c4 T _ZN36_GLOBAL__N_foo.cpp_00000000_DF1B9ED13fooEv ということで。 (gdb) b _ZN36_GLOBAL__N_foo.cpp_00000000_DF1B9ED13fooEv でどうでしょうか? それと、DF1B9ED13の部分はコンパイルする毎に変る様子だったので御自身の環境でやらないとダメかと思います。 もしくは、 % nm a.exe | c++filt | grep foo 080483c4 T (anonymous namespace)::foo() ということなので (gdb) b (anonymous namespace)::foo() でもいいかと思います。 ちなみに私は、 g++ (GCC) 4.1.1 GNU gdb 6.4 と、割と新し目なので違う可能性もあります。 あと、linuxなので nm で出てるアドレスは大分違うと思います。
お礼
ご回答いただきまして、ありがとうございます。No.01の方のご指摘のようにgdbをバージョンアップすることで解決しました。
お礼
ご回答ありがとうございます。試してみましたが、こちらではブレイクポイントを設定することはできませんでした。gdbのバージョンが GNU gdb 2003-03-03-csv (cygwin special) だからでしょうか...。