• ベストアンサー

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

  • kary
  • お礼率95% (82/86)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

一番良い方法かどうかはわかりませんが、 b foo.cpp:foo でブレークポイントを設定することが出来ました。 ちなみに、各バージョンは cpp (GCC) 3.4.4 (cygming special) gdb 6.5.50.20060706-cvs (cygwin-special) です。

kary
質問者

お礼

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

その他の回答 (1)

回答No.2

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 で出てるアドレスは大分違うと思います。

kary
質問者

お礼

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

関連するQ&A

  • GDBである変数に条件を設定してブレイクしたい

    現在、GDBでデバッグを行っています。 https://sourceforge.jp/projects/cc1101driver/scm/svn/blobs/2477/trunk/20140411/event.c こちらのevent.cというファイル内の”void *event(void *param)” 関数内のi==1の場合にブレークをかけたいと思っております。 http://uguisu.skr.jp/Windows/gdb.html こちらのサイトで”ブレークポイントにブレーク条件を設定する”という項目で (gdb) break file.cpp:function (gdb) condition 1 x==1 (gdb) run このような設定があるとのことで、 (gdb) break event.c:*event このように設定してみたところ次のようなエラーが出てきました。 No source file named event.c. このように出てブレークポイントが設定できないのですが、これを解決する方法をご教示頂きますようお願い致します。

  • GDBである変数に条件を設定してブレイク(2)

    お世話になっております。 https://sourceforge.jp/projects/cc1101driver/scm/svn/blobs/2477/trunk/20140411/event.c こちらのevent.cのevent関数(1039行目)でブレークする方法として、 (gdb) break event.c:event このようにしてbreakpointの設定を行えるようになった野ですが、このevent関数内にある変数i(1041行目)の数値で条件としてi==1になったらブレークをかけたいと思っているのですが、 (gdb) condition 1 i==1 (gdb) run このように設定してrunさせてもブレークしません。ブレークさせるにはどうしたら良いかご教示頂きますよう、お願い致します。

  • Eclipseのブレークポイント

    ある行を通るのですが、ブレークポイントを設定しても最初に、そこで止まりません。 必ず、main()の最初行から順番に実行してしまいます。 環境は以下のとおりです。 -JDK 1.6.0_22-b04 -Eclipse 3.6 All in One -Windows Vista アドバイスをいただけませんか?

    • ベストアンサー
    • Java
  • qsortの関数ポイントについて

    qsortの関数ポイントについて int int_cmp(const int *a, const int *b) { ------ } main { qsort(x,nx,sizeof(int),(int (*) (const void *, const void * )) int_cmp); 上記の(1)関数のポイント,(int (*) (const void *, const void * )) int_cmpを  普通の(2)関数ポイント(* int_cmp) (const void *, const void * )で呼べない  理由 、また、(1)(2)は、同じ意味でしょうか、教えて頂きたい。

  • PHPの名前空間について

    PHP5.3~からの名前空間について質問です。 この名前空間、私は最初JAVAやPerlなどのクラスやパッケージ的な動き・・・・・つまり 実際にディレクトリに分けて分割して管理するようなものだと思っていたのですが foo/bar/hoge.java import foo.bar; で実際に new foo.bar.hoge.(); としないといけない箇所を new hoge(); だけで処理できるという動き・・・。 perlでもパッケージやクラスなんかは似たような動きですよね? でもPHPの名前空間は、ディレクトリにわけたりしないようなのですが、 これは、意味があるのでしょうか? PHPの場合はただ、関数やクラスに別名をつけれるだけですか? 特に、必要とは思えないのですが 識者の方ご教授下さい。

    • ベストアンサー
    • PHP
  • 関数名の名前の衝突について。

    こんにちは。 関数名の名前の衝突で困っています。 以下のような感じで名前空間でUNICODEでマルチバイト版とで定義しています。 Win32APIのGetFileSize関数を例に説明します。 Win32APIのGetFileSize関数はファイルハンドルを指定しなければいけないので 直接ファイル名からファイルサイズを取得できるように同じ名前の関数を 名前空間で区切って以下のようにしました。 ---------------- Foo.h -------------- #include <windows.h> namespace Foo { #ifdef UNICODE     #define GetFileSize GetFileSizeW #else     #define GetFileSize GetFileSizeA #endif // !UNICODE     DWORD GetFileSizeW( wchar_t* const szFilename ){ return 0 ;}     DWORD GetFileSizeA( char* const szFilename ){ return 0 ;} } ---------------- Foo.h -------------- 上記の関数はちゃんと動作することは確認できましたが、本来のWin32APIの DWORD GetFileSize( HANDLE hFile, LPDWORD lpFileSizeHigh ) を ---------------- main.cpp -------------- #include <windows.h> #include "Foo.h" void func( HANDLE hFile ) {     DWORD dwFilesize = ::GetFileSize( hFile, NULL ) ; } ---------------- main.cpp -------------- 上記のように利用しようとすると、 error C2039: 'GetFileSizeW' : '`global namespace'' のメンバではありません。 error C3861: 'GetFileSizeW': 識別子が見つかりませんでした というエラーが出てきてしまいます。 これを解決するためにはUNICODEでマルチバイト版とで再定義してしまっている #defineの部分を削除するしかないのでしょうか? もし解決方法がありましたら教えていただけないでしょうか?

  • デバッガでブレークポイントを削除できない

    今読んでる本、CGIプログラミング第2版ですが、いよいよ終盤です。 第15章 CGIアプリケーションのデバッグまで読み進めてきました。 Perlデバッガのコマンド表にあるコマンドを試しています。 b[ 行番号| サブルーチン名]コマンドでカレント行、指定行、指定サブルーチンへブレークポイントを設定できました。 今度は d[ 行番号| サブルーチン名]コマンドでブレークポイントを削除しようとしたのですが、削除できていませんでした。 何度試しても先ほど設定したブレークポイントで停止してしまいます。 さらに引数として行番号やサブルーチン名を与えたときは次のエラーが発生します。 Number found where operator expected at (eval 5)[/usr/lib/perl5/5.8.0/perl5db.pl:17] line 2, near "d 5" eval '($@, $!, $^E, $,, $/, $\\, $^W) = @saved;package main; $^D = $^D | $DB::db_stop; d 5; ;' called at /usr/lib/perl5/5.8.0/perl5db.pl line 17 DB::eval called at /usr/lib/perl5/5.8.0/perl5db.pl line 1323 DB::DB called at try line 4 (Do you need to predeclare d?) eval '($@, $!, $^E, $,, $/, $\\, $^W) = @saved;package main; $^D = $^D | $DB::db_stop; d 5; ;' called at /usr/lib/perl5/5.8.0/perl5db.pl line 17 DB::eval called at /usr/lib/perl5/5.8.0/perl5db.pl line 1323 DB::DB called at try line 4 syntax error at (eval 5)[/usr/lib/perl5/5.8.0/perl5db.pl:17] line 2, near "d 5" またDコマンドは全ブレークポイントを削除するそうですが、これも効きませんでした。 本件について、何か情報をお持ちの方、教えてくださいm(__)m

    • ベストアンサー
    • Perl
  • vi(vim)について(exラインにコピーとgdbについて)

    よろしくお願いします。 vi(vim)もしくはgvimについて、2件の質問があります。 (1)exコマンドにコピーをする方法を教えてほしい 長い関数があって(例:hogehogehoge)、この関数を検索などをするとき /hogehogehoge としますが、関数名が長い場合など、バッファのコピーを張り付けたいのです。 gvimだと:ptagなどで使いたいです。 (2)vi(gvim)でグラフィカルにgdbデバッガを使いたい インターネットで検索すると、複数のウィンドウでgdbをする例などもありますが、うまくいきませんでした。 helpを見てもよくわかりませんでした。 正しいやり方を探しています。 (vimはemacsのように「環境」になりつつあるイメージです) 一番やりたいことは、vim上でステップ実行です。 お世話になりますが、よろしくお願いいたします。 #環境 linux Fedora core 8 vim version 7.1.242 #vimのおもな使用目的 プログラミング #emacsは挫折しました 俗に言うemacs小指になってしまったので,vimに朝鮮しています。

  • PHPの名前空間に関して質問です。

    PHPの名前空間の仕様において コールの仕方が三通りあるとおもいます。 1=>被修飾名 (これは、従来どおりのコールのしかたですよね。 特定の名前空間内でその名前空間で定義した関数やクラスをその名前空間内でコールする場合は、 new TestClass(); といった具合に、名前空間は意識せずにコールできます。 2=>完全修飾名 (これは各名前空間内においてグローバル空間内で定義されたクラス等をコールするときにしようしますよね? A¥B¥Cという名前空間からD¥E¥Fという全く別の名前空間で定義されたクラス等をコールするときもこの、完全修飾名でないとコールできないとおもいます。 さて、最後の 3=>修飾名でのコールですが たとば、$obj = new A¥B¥C¥TestClass(); というコールの仕方ですよね。もっというと頭にバックスラッシュの使ない名前空間の使いかた。これって、実際はグローバル名前空間ないでのみしか使えないですよね? グローバル空間意外の特定の名前空間内でこの修飾名でのコールができる状況って存在しないですよね? もしある場合どういう状態でしょうか? よろしく師事ください。

    • ベストアンサー
    • PHP
  • 無名パッケージからのインポート

    Javaの初学者です。 無名パッケージ内のクラスを、他のパッケージ中から呼びたいのですが、うまくいきません。 Test/src/Test.java ---- public class Test { public int m1; public Test() { m1 = 1; } } ---- という既存のプロジェクトがあるとします。 このプロジェクト内のTest.javaを利用したいと考えたとき、例えば、 Test2/src/Test2.java ---- import Test; public class Test2 { public static void main(String[] args) { Foo foo = new Foo(); System.out.println(foo.m1); } } ---- はうまくいきます。 ですが、Test2プロジェクトを Test2/src/test2/Test2.java ---- package test2; import Test; public class Test2 { public static void main(String[] args) { Foo foo = new Foo(); System.out.println(foo.m1); } } ---- のようにするとうまくいきません。 package test2の中から、外の無名パッケージのTestクラスを使用するには、どのようにすればよいでしょうか? どうぞよろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう