gdb チートシート
[履歴] [最終更新] (2018/11/29 17:56:40)
1
作品
407
技術情報
最近の投稿
ここは
趣味の電子工作を楽しむ人のためのハードウェア情報共有サイト

技術情報や作品の投稿機能、リアルタイム遠隔操作 API をご利用いただけます。
新着作品

概要

GNU Debugger (GDB) の簡単な使い方を記載します。

起動方法

main.cpp

#include <iostream>
#include <unistd.h>
using namespace std;

int main() {
    int i = 0;
    while(true) {
        sleep(1);
        cout << ++i << endl;
    }
    return 0;
}

実行プログラムを指定

-g -O0 オプションを指定してデバッグモードでコンパイルします。

g++ -Wall -g -O0 main.cpp
gdb ./a.out
(gdb) run
(gdb) run 引数

プロセスID を指定

gdb ./a.out -p 1234

コアファイルを指定

gcore 1528
gdb ./a.out -c core.1528

実行プログラムの確認

file core.1528
core.1528: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, from './a.out', real uid: 1000, effective uid: 1000, real gid: 1000, effective gid: 1000, execfn: './a.out', platform: 'x86_64'

共有ライブラリの確認 (ldd でも確認できる情報)

(gdb) info share

別環境でコアファイルを解析する場合は、必要に応じて共有ライブラリのパスを追加する必要があります。

(gdb) set solib-absolute-prefix /tmp/lib
(gdb) set solib-search-path /tmp/lib
(gdb) file ./myhello
(gdb) core-file ./core.1234

別環境でコアファイルを解析する場合は、ソースコードのパスを追加すると便利です。

(gdb) directory /tmp/src

操作方法

ステップ実行

cs 等のコマンドは、エンターを入力するだけで繰り返し実行できます。

現在位置の確認 (list)

bt
l 123

一行進める (next)

n

ステップを進める (step; 関数の中にも入っていきます)

s

変数の値を確認、設定 (print)

p myvar
p myvar = myvar + 1

次のブレークポイントまで進める (continue)

c

バックトレースを表示

bt

関数内で実行すると、関数を抜けるまで進める。

(gdb) finish

for/while で実行すると、for/while を抜けるまで進める。

(gdb) until

シェルコマンドを実行

(gdb) shell pwd
(gdb) shell g++ -g -O0 main.cpp
(gdb) shell
$ pwd

作業ログの出力

./gdb.txt にログ出力されます。

(gdb) set loggin on
(gdb) set loggin overwrite on

ブレークポイント

(gdb) b ファイル名:行数
(gdb) break ファイル名:行数 if i == j
(gdb) break main
(gdb) info breakpoints
(gdb) info breakpoints ブレークポイント番号
(gdb) delete
(gdb) delete ブレークポイント番号
(gdb) disable ブレークポイント番号
(gdb) enable ブレークポイント番号

変数の値の監視

値が変更される度にデバッガが停止します。

(gdb) watch i

読み込み時の監視

(gdb) rwatch i

書き込みと読み込みの監視

(gdb) awatch i

関数引数、ローカル変数、例外情報の表示

(gdb) info args
(gdb) info locals
(gdb) info catch

スタックフレームの移動

up
down
frame フレーム番号
(f フレーム番号)

シグナル処理情報の確認

info signals
info signals シグナル名

シグナルの送信

signal シグナル名

コアファイルの生成

(gdb) generate-core-file

コアファイルの最大サイズの確認および最大サイズの解除

ulimit -c
sudo su -l
ulimit -c unlimited

スレッド一覧の表示

(gdb) info threads

実行ファイルのないプロセスへのアタッチおよび制御

gdb -p 1234
(gdb) ...何らかの制御
(gdb) detach
(gdb) quit

型を調査

(gdb) whatis 変数名

CPython のコアダンプを解析したい場合

gdb python -c core.xxxx

参考: Python の実装を確認

$ python
>>> import platform
>>> print platform.python_implementation()
CPython

CPython の NSMALLPOSINTS が 257 となっている場合、0-256 の整数は同じメモリのデータが使い回される。

In : id(256)
Out: 94652018165808

In : id(256)
Out: 94652018165808 ←同じ

In : id(257)
Out: 94652020901008

In : id(257)
Out: 94652020900864 ←異なる

インスタンスのメソッドを実行

(gdb) p obj
$9 = {px = 0x557bb8d30c60, pn = {pi_ = 0x557bb8cf28d0}}
(gdb) p (obj.px)->MyIsOk()
$8 = false

全スレッドに対して bt を適用

thread apply all bt
関連ページ
    概要 よく使う python ライブラリのサンプルコード集です。 JSON #!/usr/bin/python # -*- coding: utf-8 -*- import json arr = [1, 2, {'xxx': 3}] # オブジェクト ←→ JSON 文字列 jsonStr = json.dumps(arr) arr2 = json.loads(jsonStr) #
    バイナリファイルから文字列を抽出する (strings) 文字列らしい部分をバイナリファイルから抽出して出力するコマンドです。得体の知れないコマンドのオプションを調べたり $ strings /usr/bin/gcc | grep ^-- --help --target-help --sysroot= --all-warnings --ansi --assemble --assert --cl