• ベストアンサー

Linux環境でC++のGDBを途中から実行したい

初歩的な質問で申し訳ないのですが、 現在LinuxでGDBの勉強をしています。 LinuxでC++で組んだプログラムを実行する際に 1.gdb a.out 2. run でmainから起動し、<調べたいクラス>::<関数>にbreakpoint設定を行ってから cで飛ばしていたのですが、 起動時、またはrun時に調べたいクラスの関数からはじめるということは可能なのでしょうか? 拙い文章で申し訳ありませんがご存知の方ご教授お願いいたします。

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

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.3

えー、「前もって用意されたコマンド手順」を参照って書いてるんですが…… もうちょっと突っ込んで書くと「クラスメンバ関数の頭にbreakpoint設定、その後run」というユーザ定義コマンドを設定してはどうか、ということです。 コマンド定義について詳しく書いてあるところを見つけたので参考にしてください。 http://www.asahi-net.or.jp/~wg5k-ickw/html/online/gdb-5.0/gdb-ja_17.html クラスメンバ関数がC関数のようにコマンド一発で呼べないのは、インスタンスがないとアドレスが確定しないからでしょう。

nuno0920
質問者

お礼

お礼遅くなり申し訳ありません。 いろいろと素人な質問に相手していただきありがとうございました。

その他の回答 (2)

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

> 今までそれでやっていたのですが、直接呼べる方法は無いのかという質問です。 質問文からはとてもそうは読み取れませんでした。 それはさておき、以下の「前もって用意されたコマンド手順」辺りが参考になるのではないかと。 http://flex.ee.uec.ac.jp/texi/gdb-j/gdb-j_toc.html

nuno0920
質問者

補足

申し訳ありません。 最初の質問文のrunとbreakpoint設定の順序が逆になっていました。 http://flex.ee.uec.ac.jp/texi/gdb-j/gdb-j_toc.html は質問の前に一応目を通したのですが gdbコマンド自体のオプション、runの時のオプションからは 途中からの実行ができる方法は読み取れませんでした。 C言語の場合はgdb起動後にmainにb設定をしておいて、 run実行後に「call 関数名」でいけるのですが これをC++で特定のクラスから行えればいろいろ便利かなと思い質問した次第です。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

breakpointを設定してからrunすればいいのでは?

nuno0920
質問者

補足

今までそれでやっていたのですが、直接呼べる方法は無いのかという質問です。

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

  • arm-linux-gdbをMeadowで使う方法ありますか?

    Cを書くのに、GDB + Meadowを使い始めました。 今回、arm-linux-gccで、組込み用のプログラムをクロスコンパイルしています。そこで、M-x gdbのような感じで、arm-linux-gdbをMeadow上で使うことはできますでしょうか?(例えば、M-x arm-linux-gdb みたいな)やり方、もしくは、参考になるサイトがあればお教えください。 ちなみに、現段階では、gdbserverをターゲットに置いて、arm-linux-gdbをCygwin上から直接起動してデバッグすることには成功しております。Cygwin暦はそれなりにあるのですが、emacs関連の知識は最近始めたばかりで、ほぼ初心者レベルです。よろしくお願いいたします。

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

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

  • Linux上で実行関数使用

    Windowsで作成したphpプログラムをLinuxに移動させようとしています。 そのプログラムの中ではC言語で作成したプログラムの実行形式(.exe)をshell_execを使って実行させています。 Linux上で動作させる場合は.outを実行すればよいとはわかるのですが、 どの実行関数を試してみてもパスが通らないか、通っても動作していなor結果が返ってこないようで、全く反応がありません。 .outを単体で実行させた場合は問題なく動作するので、C言語のプログラム上の間違いではないです。 どなたかLinux上で、phpで実行形式を動かす方法を知りませんか?

    • 締切済み
    • PHP
  • linuxでの実行中のプログラムのトレースの仕方

    アスタリスクというlinuxで動作するpbxのオープンソースのC言語のソフトがあります。 アスタリスクを立ち上げたとき、関数がどういう順序で呼び出されているかを調べる必要があります。 そこで、http://www.geekpage.jp/blog/?id=2007/1/17を参考にgdbでアタッチしてみましたが、一部 しか表示されないのででうまくいきませんでした。(全関数の呼び出しを表示するにはメモリ・レジスタが不足と出ました) 実行中の複数のモジュールが絡み合うプログラムの関数の呼び出され方を調べるのに、なにか良い方法がありましたら教えて下さい

  • Cygwin+GDBでターミナルの設定?

    Linux系ではないのですが、こちらには詳しい方がいらっしゃると思いますので、ここで質問させてください。 Cygwin環境でgdbを走らせてデバッグしようとしているのですが、gdb上ではTABキーによるコマンド補完や、↑キーによるコマンド履歴呼び出しができずに困っています。 bashを起動した状態のときは、bash上ではコマンド補完や履歴呼び出しはできています。 そこからgdbを起動すると補完や履歴呼び出しはできなくなります。 これは、ターミナルの設定の問題ですか?それともgdbの設定の問題ですか? 「・・・できなくなる」と書いてますが、全く利いていないわけではないようです。 gdb上で、↑キーを押すとその時点ではカーソルが上に移動するだけです。さらにもう一度↑キーを押してから(もちろん更にカーソルがもう一行上に移動する)ENTERを押すと、2つ前に入力したコマンドが実行されます。 また、同じくgdb上で、「d」とタイプしてからTABキーを2回押すと、カーソルがタブスペースの分だけ右へ2回移動するだけですが、ENTERを押すと「d」から始まるコマンドの一覧が出ます。 どうやら、ENTERを押すまではキー操作がgdbに伝わっておらず、ENTERと同時にgdbに渡されているようです。 それから、CTRL+Cで実行中のプログラムが停止しません。しばらくだんまりになったあと、gdb自体が終了します。これも、どうにかして、CTRL+Cで止まるようにしたいです。 関係ないかもしれませんが、bashのバージョンは4.1.10、gdbのバージョンは7.2です。 よろしくお願いします。

  • C言語のコンパイルと実行ファイル作成について

    Cで人が書いたプログラムを修正しています。 IDEではなくLinux環境でのコード修正が初めてで、デバックでのバグ潰しや実行ファイル生成がうまく行かず困ってます。 warningをきちんと治したいというのと、gdbの起動がうまくいかない、という2点です。 あるディレクトリに保存された、ABCという文字を含んだサブディレクトリに対して処理を行うプログラムです。 まず1つめ、warningの修正について教えてください。 test=opendir(buff); //DIR変数ポインタ  *test にパスを代入して、 //そのパスにABCという文字が含まれていたら以下を実行、というところ if(test==NULL&&errno!=){ check=strchr(test,"ABC"); //checkはchar型ポインタです。ここでincomparableな変数だというwarningが出ます。 DIRポインタで取得したパス名をstrchrで比較することはできないのでしょうか。char変数mojiを追加しcheckもchar型に変更して  moji = test  check=strchr(moji,"ABC") としてみましたがNGでした。 このwarningは単に警告なのでとりあえず実行ファイルを作ってデバックしてみたら、と言われ a.outファイルを生成しました。デバッカgdbを起動したところで、2つ目の疑問が発生しました。 gdb 対象ファイル名.c (gdb) break main   //と打つと、ここで No symbol table is loaded. Use the "file" command.  //と表示されます。 これは、どう対処したらいいのでしょうか? 調べてあれこれ対応してみたのですがどうにも対処できず困っています。 ぜひ教えていただけると助かります。 宜しくお願い致します。

  • Linuxで実行ファイルを実行

    Linux上でC言語をコンパイルし、作成された実行形式ファイルを実行しようとしたのですが、実行できません。 作業フォルダは /var/www/html です。 gcc program.c でコンパイル、 作成されたa.out(ls でフォルダ内にあるのは確認済です) を以下の方法で実行しようとしましたが、全てできませんでした。 1. [root@host-210-161-57-177 html]# a.out bash: a.out: command not found 2. [root@host-210-161-57-177 html]# ./a.out opendir: No such file or directory 3. [root@host-210-161-57-177 html]# %./a.out bash: fg: %./a.out: no such job 4. [root@host-210-161-57-177 html]# % ./a.out bash: fg: %: no such job gcc -o program program.c でファイル名を指定してコンパイルしてみても同様の結果でした。 ご存じの方、どうかご回答をよろしくおねがいします。

  • C#で仮想環境上(Linux)のスクリプト実行

    Windowsアプリケーションから、VirtualBox(仮想化ソフト)上の Linuxのシェルスクリプトが実行されるようにしたいと考えているのですが、 どのような手法があるか、ご教授頂けますでしょうか。 イメージとしては、 Visual Studio上で実行ボタンをクリックすると、 Windows上で実行されるのと同様に、 Windowsアプリケーション上のボタンをクリックすると、 Linux上のシェルスクリプトが実行されるようにしたいと考えております。 仮想環境は起動していることが前提です。 また、開発環境は Visual C# (2010)です。 よろしくお願いいたします。

  • Androidの並列処理(定期実行)

    http://d.hatena.ne.jp/shuji_w6e/20090701/1246459813 上記のURLを参考に、定期的にGPS情報を取得しDB登録するSampleプログラムを作成しました。 public void run() {    textView.setText(new Date().toString()); } } のrun()の中身をGPS取得する処理に変更しただけで、そこまでは上手くいきました。 このSampleは単一のActivityクラスだけで構成されていますが、この「定期的にGPS情報を取得する」という処理を別クラスにしたいと考えました。 そこでActivityを継承した、「GetGpsService」というクラスを作成し、そのクラスをmainのActivityから呼び出せばいいと思ったのですが、上手くいきません。 単純にmainのActivityで、GetGpsServiceのインスタンスをnewすれば、GetGpsServiceのonCreateが実行されて処理が実行されると思っていたのですが、newしてもクラス内のどこのBreakPointにも止まりませんでした。根本的な考え方が間違っているのでしょうが、別クラスにしたGPS情報の定期取得処理をmainのActivityから呼び出すには、どのようにしたら良いのでしょうか? 画面変遷がなくても、intent等を使う必要があるのでしょうか?

    • ベストアンサー
    • Java

専門家に質問してみよう