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
と省略形を使うとうまくいった。な~ぜ~??
「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
と省略形を使うとうまくいった。な~ぜ~??