ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

GDBで、「動いているプログラムをデバッグする」方法

2018-09-09 11:43:31 | Weblog
GDBでデバッグするとき、

   「gdb プログラム名」で起動して、
   「run」とか[r」とかすれば、

デバッグできるけど、
すでに動いているプログラムをデバッグしたい場合、
その穂方法だと、別プロセスを動かすことになってしまう。

そうではなくて、今動いているプロセスのプログラムを、
デバッグしたいというとき、どうするか・・・

 ネットで調べると、「attachする」と書いてあり、確かにその通り
なんだけど、そこにトラップがあるので、一応書いておく




■お題
 プログラムがある。今回はtest.cという以下のプログラムを用意した。

 デバッグしたいので、gcc -gオプションでコンパイルし、
 まあ、とりあえず実行すると、こんなかんじ。

 プログラム上では、c=-1のときがあるので、これを、デバッガで
Cの値を入れてデバッグしたい。
 だだし、今回は、上記のように動いている状態でするものとする。

※この場合は、そこまですることないけど、IoTで複数のプロセスを立ち上げたり、
 準備が必要な時、1プロセスだけを立ち上げてrunさせるのだと面倒なことが
 ある。そんなときの話を簡略化したと思ってください




■概要
・(前提)デバッグ対象のプログラムは動いているものとする
 (下の写真の左側のウィンドウ)

・sudo gdbでデバッガ立ち上げ
 (sudo しないと、うまくアタッチできないことあり)

・プロセス番号を確認
 (ps -aで確認できる。別ウィンドウで行ってもいいし、
  shell ps -aとして、shellをつければ、シェルコマンドが実行できるので、
  デバッガ内で実行できる。ちなみに、自分で作ったシェルコマンドとかも実行できる)

・attach プロセス番号
  で起動する

ここまでのお写真が、こんな感じ

※attachしたら、runしなくていい。




■ブレークポイントを貼る、ここでトラップ!
 attachしたとき、そのままプログラムを読んでくれればOKなんだけど、
 いろんなプログラムとリンクしたりして、読み込んだのが目的ソースで
 終わっていないことがある。たとえば今回の例、listを打つと、初めは
 見えないと言ってくる!

 その場合は、「file 実行ファイル名」をして、実行ファイルを指定する
 (そうすると、ソースもわかる)。
 そのあとで、listすると、ちゃんと読み込んでるよね(上の写真)

 それを確認してからブレークポイントを貼る(上の写真のb 15)。
 (fileしなくても、うまくいくこともある)



■ちなみにそのあとは
 普通のデバッグとおなじ。

  cでブレークポイントのところにいって、
  setで値をセットして
  printで値を確認して
  nで次に進める

といいたいところなんだけど・・・



なせか、setがうまくいかず
s c=-1
と省略形を使うとうまくいった。な~ぜ~??

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする