GDBで変数に条件を設定してブレイクする方法

このQ&Aのポイント
  • GDBを使用して変数に条件を設定してブレイクしたい場合について質問があります。
  • 特定の条件が満たされた場合にブレイクするためには、breakコマンドに条件を指定する必要があります。
  • "No source file named event.c."というエラーメッセージが表示されてブレークポイントが設定できない問題について、解決方法を教えてください。
回答を見る
  • ベストアンサー

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. このように出てブレークポイントが設定できないのですが、これを解決する方法をご教示頂きますようお願い致します。

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

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.1

gdbがevent.cを見つけることができないようなのでgdb起動オプションの-dやgdb起動後にdirコマンドでevent.cのあるディレクトリをソースファイルの検索パスに追加してあげてください。 >(gdb) break event.c:*event あとたぶん (gdb) break event.c:event だと思います。

techhouse
質問者

お礼

回答頂きありがとうございます。(gdb) break event.c:event この操作でbreakpointを設定することができました。助かります。

関連するQ&A

  • 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させてもブレークしません。ブレークさせるにはどうしたら良いかご教示頂きますよう、お願い致します。

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

  • gdbデバッグのためのmakefile作成

    現在Ubuntu Linuxでgccプログラミングを行っています。現在、ソースコードをいくつかのファイルに分割して作成しています。コンパイル時はmakefileを使用してmakeして実行ファイルを作成しています。 現在のプログラムをgdbでデバッグできるようにしたいと思っているのですが、 その場合のmakefileはどのようにして書けば良いのかをご教示頂きますよう、お願い致します。 現在のmakefile内容 https://sourceforge.jp/projects/cc1101driver/scm/svn/blobs/2319/trunk/20140411/Makefile #test #CC = gcc #test:main.c event.c exe: main.o event.o env.o audio.o task.o comm.o menu_show_status.o gcc -o exe main.o event.o env.o audio.o task.o comm.o menu_show_status.o -lpthread main.o:main.c gcc -c main.c event.o:event.c gcc -c event.c env.o:env.c gcc -c env.c audio.o:audio.c gcc -c audio.c task.o:task.c gcc -c task.c comm.o:comm.c gcc -c comm.c menu_show_status.o:menu_show_status.c gcc -c menu_show_status.c

  • GDB デバッガでの変数の表示について

    変数の値の変化を調べるためにGDBデバッガを使っています。現在は、breakでポイントを設定して、disp iで表示する変数を決めてstepで一行ずつ手動で実行しています。 しかし、これを手動でやらなくてももっと簡単にできるのではないかという意見がでたので、自分でいろいろ調べてみたんですがなかなか見つかりませんでした。 変数の値が変化した時に停止とかならあるんですが、そうではなく変数の値が変化したら表示するみたいなことってできないでしょうか。 今は一行ずつstepでi=1、i=2・・・な感じで見ていますが、例えばrunで実行したらすぐにi=1、i=2・・・が全て表示されるようにできないでしょうか。分かりにくい気がしますが、よろしくお願いします。

  • 1つ以上のブレークポイントが設定できませんでした。

    Visual Studio C++ 6.0 でプログラミングをしています。 以前まではブレークポイントが普通に使えたのですが、最近ブレークポイントを設定すると 『1つ以上のブレークポイントが設定できませんでした。これらのブレークポイントは無効です。実行プログラムはプログラムの始めで停止します。』 という注意書きが現れ、ブレークポイントが使えません。 ブレークポイント無しでは問題なくビルドでき実行もできます。 恐らく原因として考えられるのが、友人がリリースモードの方が処理が早いとか言って設定をいじり、うまくいかなかったことだと思います。 『構成』『アクティブな構成の設定』を見てもデバックモードになっていました。 どなたかご回答よろしくお願い致します。 OSはXP、openCVを使用しています。

  • gdbを使ったデバッグの方法について

    Linux環境でC言語プログラムを開発している者です。 デバッグをgdbで行おうと思っているのですが、-gオプションを付けてgdb ./a.out でCの実行モジュールを使ったデバッグは行ったことはあるのですが、以下のようなshellスクリプト内で環境変数の設定を行い、設定した環境変数下で./a.out内にbreakポイントを設定するにはどうすればいいのでしょうか?ご教授お願いします。 Test.shの内容 #!/bin/sh export ftn22=’/home/test’ ./a.out Cの実行モジュール

  • eclipse+CDTで実行ファイルとソースが連携しない

    このような質問サイトに投稿するのは初めてなので 至らない点がありましたら、ご指摘ください。 現在以下の環境でcのソースのデバッグを試みています。 redhat9 eclipse3.3 CDT4.0 gdb6.6 gcc4.1.1 ・空のCプロジェクトをつくりソースをインポート ・makefileは既存のものを使用 ・デバッグモードでビルド ・バイナリを作成(更新時間にて新規作成を確認済み) ・必要な箇所にブレークポイントを設定 ・デバッグモードで実行 コンソールにブレークポイントをはったソース(例えばtest.c)について 以下のメッセージが表示されます。 No source file named test.c 実行ファイルとソースが連携しないため、ステップ実行でのデバッグが できない状態です。 F8を押すと実行ファイルは実行されます。 ファイルのパスを通すのかなと、「source lookup path」にフォルダを 指定してみましたが、特に変わらずでした。 上記問題について、何かご存知でしたらご教授ください。 よろしくお願いいたします。

  • qt creatorのプロジェクトでビルドエラー

    現在Debian Linuxが搭載されているBeagleBoneBlackにqt creatorをインストールしてプログラミングしています。 windows8.1のPCにもqt creatorインストールしていて、こちらでhello worldのテストのプロジェクトを作成して動作できることを確認しており、このプロジェクトをDebian Linux側にも移してビルドしてみたのですが、エラーが発生してしまいます。 https://sourceforge.jp/projects/cc1101driver/scm/svn/tree/2497/trunk/20140717/tes0721_02/ こちらが現在のqt creatorのプロジェクトです。 tes0721_02.proというプロジェクトファイルをDebian Linux側で開くとつぎのようなエラーが表示されます。 Configure Project No valid Qt versions found. Please add a Qt version in Tools > Options > Build & Run(Qt Creator > Preferences > Build & feRun on Mac OS) or via the maintenance tool of the SDK. このエラーの解決方法をご教示頂きますよう、よろしくおねがい致します。

  • isoファイルにレイヤーブレークを設定したいです

    こんにちは。 DVD+R DLに焼く前提で、isoファイルを作成するのですが、レイヤーブレークの設定はどうしたらよいのでしょう? 7GB超えのisoファイルを作成しようとしているのですが、レイヤーブレークの設定の仕方がわかりません。 最初から説明します。 先日、親戚から「バラバラに撮ってあるホームビデオのDVD映像を、なるべくひとまとめにできないか」という相談を受けました。昔、テープで録った映像を、お店で各々DVD-Videoにしてもらっていたようです。 ただディスクにしただけなので、1枚のDVDに、いろいろな時々の映像が、ベターっと収録されているようなものが複数枚あります。内容は、長いものも短いものもあります。 これらの中から、冗漫な部分をカットして、イベントごとにチャプターで区切れるようにして、なるべく1枚のディスクに見やすくまとめてくれ、という依頼です。 とりあえず、素材を預かってきて、DVD Fab(ver.7) のファイルモードでリッピングしました。 これらをDVD Shrink 3.2 上で、編集モードでコマギレにしてつないで、ひとつのisoファイルとして書き出してみました。設定は2層を前提とした容量にして、「レイヤーブレークの除去」のチェックは外しました。 そしてこのisoファイルを、ImgBurnでDVD+R DLに焼こうとしたのですが、「このファイルにはレイヤーブレークが設定されていません」というような(たぶん)アラートが出てしまいます。 ImgBurnの解説サイトなどを読んで、ImgBurnの機能からMDSファイルも作成したのですが、状況は変わりません。おそらくisoファイル自体に、実際、レイヤーブレークポイントが設定されていないのだと思います。 DVD Shrink上で結合し、短いタイトルが複数つながっている状態になっているので、どこかおおむね真ん中あたりのタイトル間にレイヤーブレークが設定できれば良いのだろうなとは考えるのですが、具体的な方法がわかりません。 当方、オーサリングソフトは使ったことがなく、ちょっと敷居が高い気がしています。 手持ちのDVD Fab、DVD Shrink、ImgBurnを使って、うまく目的を達する方法はあるのでしょうか? 詳しい方のご教示をいただきたいと思います。よろしくお願いいたします。

  • h8/3052 GDB-stub上でのプログラムの実行 ITUタイマ割込みの使用について

    現在h8/3052でITUタイマを利用して20msecごとに割り込みがかかるようにするプログラムを作成していますが、割り込みに関して動作が確認できません。デバッグ環境を整えるためにターゲットにはあらかじめGDB-stubを書き込んであります。 実際に作成しているプログラムの割込みの部分は、 //割込み処理関数 pragma interrupt void int_imia0(void) //割り込み関数 { extern volatile unsigned int count; count ++; ITU0.TSR.BIT.IMFA = 0; } で割り込みが行われたときの処理を行い。 //メイン関数内 EnableInterrupt(); //割り込み許可 StartITU0(); //タイマスタート while (1){ AD.CSR.BIT.ADST = 1; /*変換スタート*/ while (AD.CSR.BIT.ADF == 0); /*変換終了待ち*/ data[c] = AD.DRA >> 6; /*下位へ6ビット分ずらす*/ data[c] = data[c] & 0x3ff; /*上位6ビットクリア*/ time[c] =(count * 2000000) + (ITU0.TCNT * 32); /*A/D変換処理時間の算出*/ if(time[c]>20000000) { bleak; } } のようにして、ここで20msecごとに割り込みがかかるように設定しています。 で、出力ファイルの //MAPファイル Name Origin Length Attributes vectors 0x00220000 0x00000100 r rom 0x00220100 0x00007f00 xr ram 0x00228000 0x00007000 xrw stack 0x0022f000 0x00001000 rw vectorアドレス ITU0割込みベクタアドレス(0x220060) 0x00220060 0x4 LONG 0x22020a DEFINED (_int_imia0)?<code 340> (_int_imia0):<code 340> (_start) として、外部RAM領域に設定したvectors領域のベクタ領域に割込み関数のアドレスが入るようにしています。 実際に動かすと、割込み関数でブレークポイントを設定しても割り込みがかからずにプログラムが動かなくなってしまいます。(どこかに飛んでいってしまっている。) ここで質問なのですが、GDB-stub上でプログラムを動かす場合に、 ・割り込みがかかった場合のベクタアドレスはGDB-stub側で設定しているベクタアドレス(内部ROM0x000060)に飛ぶようになってしまっているのか。 が、気になっています。