うちのカレーにはこれが入ってる!って食材ありますか?

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.と表示されてブレイクポイントが設定されません。無名の名前空間にある関数にはどのように入力してブレイクポイントを設定するのでしょうか。とりあえず、今は行番号によりブレイクポイントを設定しています。ご存じの方がいらっしゃいましたら、ご教授ください。お願いします。

A 回答 (2件)

一番良い方法かどうかはわかりませんが、



b foo.cpp:foo

でブレークポイントを設定することが出来ました。
ちなみに、各バージョンは
cpp (GCC) 3.4.4 (cygming special)
gdb 6.5.50.20060706-cvs (cygwin-special)
です。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。試してみましたが、こちらではブレイクポイントを設定することはできませんでした。gdbのバージョンが
GNU gdb 2003-03-03-csv (cygwin special)
だからでしょうか...。

お礼日時:2007/02/20 05:24

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 で出てるアドレスは大分違うと思います。
    • good
    • 0
この回答へのお礼

ご回答いただきまして、ありがとうございます。No.01の方のご指摘のようにgdbをバージョンアップすることで解決しました。

お礼日時:2007/02/22 06:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報