gdb 2

gdb 1の続きです。

gdbの基本的な操作について整理します。

quit

gdbを終了させます。

quitで終了させます。


(gdb) quit

省略するとqです。


(gdb) q

ほとんどいつもQuit anyway ?と訊かれます。


(gdb) q
A debugging session is active.

	Inferior 1 [process 3656] will be killed.

Quit anyway? (y or n) 

最後までrunさせてからquitする場合なんてほとんどないと思うのですが。
ほぼ毎回qでyと思います。

下記は等価です。
quit / exit / q
2.2 Quitting GDB

step

1行ずつ進めます。関数の中に入ります。

通しでやった様子です。


jn@jn-virtual-machine:~/develop/sandbox$ gdb ./degree_to_radian 
GNU gdb (Ubuntu 9.2-0ubuntu1~20.04) 9.2
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./degree_to_radian...
(gdb) b main
Breakpoint 1 at 0x1129: file degree_to_radian.c, line 9.
(gdb) r
Starting program: /home/jn/develop/sandbox/degree_to_radian 

Breakpoint 1, main () at degree_to_radian.c:9
9	{
(gdb) s
10	    float deg = 90.0f;
(gdb) s
11	    float rad = 0.0f;
(gdb) s
13	    rad = degree_to_radian(deg);
(gdb) s
degree_to_radian (degree=3.0611365e-41) at degree_to_radian.c:21
21	{
(gdb) s
22	    return (degree * MATH_PI / 180.0f);
(gdb) s
23	}
(gdb) s
main () at degree_to_radian.c:15
15	    deg = radian_to_degree(rad);
(gdb) p rad
$1 = 1.57079601
(gdb) p deg
$2 = 90
(gdb) s
radian_to_degree (radian=90) at degree_to_radian.c:26
26	{
(gdb) s
27	    return (radian * 180.0f / MATH_PI);
(gdb) s
28	}
(gdb) s
main () at degree_to_radian.c:17
17	    return 0;
(gdb) s
18	}
(gdb) c
Continuing.
[Inferior 1 (process 21110) exited normally]
(gdb) 

5.2 Continuing and Stepping

next

次はnextで同じことをやります。

nextさせます。nextは関数の中に入りません。


$ (gdb) n

$ gdb ./degree_to_radian

GNU gdb (Ubuntu 9.2-0ubuntu1~20.04) 9.2
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./degree_to_radian...
(gdb) b main
Breakpoint 1 at 0x1129: file degree_to_radian.c, line 9.
(gdb) r
Starting program: /home/jn/develop/sandbox/degree_to_radian 

Breakpoint 1, main () at degree_to_radian.c:9
9	{
(gdb) n
10	    float deg = 90.0f;
(gdb) n
11	    float rad = 0.0f;
(gdb) n
13	    rad = degree_to_radian(deg);
(gdb) n
15	    deg = radian_to_degree(rad);
(gdb) p rad
$1 = 1.57079601
(gdb) p deg
$2 = 90
(gdb) n
17	    return 0;
(gdb) n
18	}
(gdb) c
Continuing.
[Inferior 1 (process 21223) exited normally]

5.2 Continuing and Stepping

gdb -tui

TUI : Text User Interface

ここからの説明は少し複雑になるので、IDEのように追いかけることができるようにします。

25 GDB Text User Interface
25.5 TUI-specific Commands

stepやnextでもやってみてください。

.gdbinit

作業の効率を上げます。

gdbは起動時に${HOME}/.gdbinitファイルがあれば、それを使います。

ということで、作ります。


$ vi ~/.gdbinit

自分の場合は履歴のみ使います。
内容は下記。

.gdbinit

set history filename ~/.gdb_history
set history save
set history size 8192

2.1.4 Initialization Files
22.3 Command History

gdb -x

もう1つ作業の効率を上げます。

setup_gdb

break main
run

入力補完が効いてくれないので名前を短くします。


$ mv setup_gdb sg

$ gdb -tui -x sg ./degree_to_radian_2

これで、break mainしてrunしたところから作業できます。

2.1.1 Choosing Files
23.1.3 Command Files

対象

説明の為の関数呼び出しの深さが足りないので追加します。

degree_to_radian_2.c

float degree_to_radian( float degree );
float radian_to_degree( float radian );
float get_pi( void );

int
main( void )
{
    float deg = 90.0f;
    float rad = 0.0f;

    rad = degree_to_radian(deg);

    deg = radian_to_degree(rad);

    return 0;
}

float degree_to_radian( float degree )
{
    return (degree * get_pi() / 180.0f);
}

float radian_to_degree( float radian )
{
    return (radian * 180.0f / get_pi());
}

float get_pi( void )
{
    static const float MATH_PI = 3.141592f;
    return MATH_PI;
}

compileします。


$ gcc degree_to_radian_2.c -g -o degree_to_radian_2

TUIモードでgdbを使います。


$ gdb -tui -x sg ./degree_to_radian_2

ソースコードの中を動き回る / 過去のことならわかる

frame / up / down

プログラムが関数を呼び出すときに、引数の情報などをframeと呼ぶメモリ領域に格納します。
関数の中の関数の中の関数の中の、と関数内で他の関数を呼ぶとき、それぞれの関数はstackとして積まれていきます。

関数に閉じた変数の情報を他の関数の中にいるときには見ることが出来ません。
このためframe/up/downを使って該当のフレームに移動して変数の値を確認します。

残念ながらここでは関数に閉じた変数を使っていないと言っていいくらい使ってないので「btからのf ?で好きな関数に移動(=基本的に戻る方)できるんだなあ」で終わってしまいます。

frameはfと省略できます。
upはup。
downはdoと省略できます。

backtraceでstack frameを確認して、f 1などとして番号指定で選択しています。

upは戻る。
downは潜る。

info

info fでframeの情報を取得しています。

finish / return

関数から抜けます。

finishは省略するとfinです。
returnを使うと戻り値を設定できます。

continue

次のブレークポイントまで進ませます。次のブレークポイントとソースコードに問題が無ければ、main関数を抜けます。

continueは省略するとcです。

もっと作業の効率を上げる

term_gdb.sh

#! /bin/sh -x

xterm -geometry 120x80+1200+40 -e arm-none-eabi-gdb -x setup_gdb &

まとめ

自分はあまりgdbは使わないです。printfの方が合います。

debuggerの方が相性が良い人もいます。

広告

IT開発関連書とビジネス書が豊富な翔泳社の通販『SEshop』
さくらのレンタルサーバ
ムームードメイン
Oisix(おいしっくす)
らでぃっしゅぼーや
珈琲きゃろっと
エプソムソルト




«       »