Linux での GDB 入門チュートリアル

Linux での GDB 入門チュートリアル

序文

gdb は Linux で非常に便利なデバッグ ツールです。コマンドライン モードのデバッグ ツールですが、その機能は想像以上に強力です。ここでは gdb の使い方について簡単に紹介します。必要な方は、以下の詳細な紹介をご覧ください。

ブレークポイント

コード内の指定された場所でブレークし、プログラムをそこで停止させます。

  • break <function> 指定された関数に入ると停止します
  • break <linenum> 指定された行番号で停止します。
  • break +/-offset 現在の行番号の前または後の offset 行で停止します。オフセットは自然数です。
  • break filename:linenum ソースファイル filename の行 linenum で停止します。
  • break ... if <条件> ... は上記のパラメータになります。condition は条件を表し、条件が満たされるとプログラムは停止します。たとえば、ループ本体で break if i=100 を設定できます。これは、i が 100 のときにプログラムが停止することを意味します。

例:

(gdb) sc_smartcontract_handler.cpp:45 を中断します
ブレークポイント 4、0x424d42: ファイル sc_smartcontract_handler.cpp、行 45。

ブレークポイント関連の操作

  • すべてのブレークポイントを削除する
  • ブレークポイントを削除する [n] ブレークポイントを削除する
  • ブレークポイントを無効にする [n] ブレークポイントを無効にする
  • ブレークポイントを有効にする [n] ブレークポイントを有効にする
  • info breakpoints [n] 現在のブレークポイント情報を表示する

観測ポイント

キャプチャ ポイントは、プログラムの実行中にいくつかのイベントをキャプチャするために使用されます。たとえば、共有ライブラリ (ダイナミック リンク ライブラリ) の読み込み、C++ 例外などです。バグを見つけるためによく使用されます。

ポイントをキャプチャするためのコマンドの形式は catch <event> です。ここで、event は次のようになります。

  • watch <expr> 変数が変更されたときに割り込みます
  • rwatch <expr> 変数が読み込まれたときに割り込みます
  • awatch <expr> 変数値が読み書きされたときに割り込みます

現在のウォッチポイント情報を表示するには、info watchpoints [n] コマンドを使用できます。

変数を表示

変数を見る最も一般的な方法は

(gdb) {変数名} を印刷する

(gdb) argc を印刷する
1ドル = 1

配列を印刷する場合、デフォルト設定により、印刷された配列の末尾が表示されないことがあります。次のコマンドを使用して、印刷される配列の最大長を設定できます。

(gdb) 印刷要素を 300 に設定する

デバッグ中にコードを表示する

  • リスト関数(list mainなど): メイン関数の近くのコードを表示します。
  • list file:function たとえば、list main.c:main: は main.c の main 関数の近くのコードを表示します。
  • list n1,n2(list 10,20など)は、現在のファイルの10行目から20行目を表示します。

リストは非常に便利ですが、まだ満足できるものではありません。実行中にコードを表示できれば良いでしょう。答えはイエスです。

gdb を起動するには、次のコマンドを使用します: gdb -tui プロジェクト名 または、gdb を起動した後、図に示すように、コマンド focus を入力します。

プログラム実行の再開とシングルステップデバッグ

gdb では、デバッグのステップ実行に関連するコマンドは主に次のとおりです。

  • 続行 次のブレークポイントまでプログラムの実行を継続します (VS の F5 と同様)
  • サブ機能に入らずにプロセスを実行します(VS の F10 と同様)
  • setp はステートメントごとにステップ実行し、サブ関数に入ります (VS の F11 に似ています)
  • until は現在のステートメントブロックが終了するまで実行されます
  • 関数の最後まで実行して終了し、関数の戻り値を出力します (VS Shift+F11 と同様)

特定のスレッドに割り込む

ブレークポイントをすべてのスレッドに設定するか、特定のスレッドに設定するかを定義できます。 GDB を使用すると、これを簡単に実行できます。

  • break <行指定> thread <スレッド番号>
  • break <linespec> thread <threadno> if ...

linespec は、ブレークポイントが設定されているソース行番号を指定します。 threadno はスレッド ID を指定します。この ID は GDB によって割り当てられることに注意してください。実行中のプログラムのスレッド情報は、「info threads」コマンドで表示できます。スレッド <threadno> を指定しない場合は、すべてのスレッドにブレークポイントが設定されることを意味します。スレッドのブレークポイント条件を指定することもできます。のように:

(gdb) bartab > lim の場合、frik.c:13 スレッド 28 を中断します。

プログラムが GDB によって停止されると、実行中のすべてのスレッドも停止されます。これにより、実行中のプログラムの全体的なステータスを確認できます。プログラムを再開すると、すべてのスレッドが再開されます。メインプロセスがシングルステップデバッグされている場合でも同様です。

要約する

上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。

以下もご興味があるかもしれません:
  • Linux で gdb を使用してコア ファイルをデバッグする方法
  • Linux デバッグツール GDB の使い方に関する簡単なチュートリアル
  • gdb および gdbserver コマンドを使用した Linux アプリケーションのデバッグ
  • Linux デバッグツール strace と gdb に基づく一般的なコマンドの概要
  • LinuxデバッガGDBの基本的な使い方の詳細な説明

<<:  Windows での MySQL 5.7.18 のインストールと設定のチュートリアル

>>:  MySql バージョンの問題に対する完璧なソリューション sql_mode=only_full_group_by

推薦する

vueはel-tableの列幅の適応を完璧に実現します

目次背景技術的ソリューション具体的な実装要約する背景Element UI は、PC で人気の Vue...

各グループの最新データを取得するためにMySQLベースのグループを実装する

序文:グループ化関数はグループ内の最初のデータを取得しますが、各グループ内の最新のデータを取得する必...

MySQL でレプリケーション フィルターを動的に変更する方法

MySQLはレプリケーションフィルターを動的に変更します今日遭遇した問題についてお話しします。今日は...

MySQL 8.0.12 のインストールと設定方法のグラフィックチュートリアル

MySQL 8.0.12のインストールと設定方法を記録してみんなで共有します。 1. インストール1...

Docker クロスサーバー通信オーバーレイソリューション (パート 1) Consul 単一インスタンス

目次シナリオタスクアイデア分析するコンセプトと選択ちょっとしたテスト環境説明予防実践テスト引用シナリ...

MySQL マスター スレーブ データが矛盾しています。プロンプト: Slave_SQL_Running: 解決策はありません

この記事では、MySQL マスターとスレーブ データ間の不一致の解決方法と、プロンプト「Slave_...

ネイティブ JavaScript 継承方法とその長所と短所の詳細な説明

目次序文プロトタイプ継承アドバンテージ欠点コンストラクタの継承アドバンテージ欠点組み合わせ継承寄生的...

JavaScript は 3 つの一般的な Web 効果 (オフセット、クライアント、スクロール シリーズ) を実装します。

目次1. 要素オフセットシリーズ2. 要素表示領域クライアントシリーズ3. 要素スクロールシリーズ1...

CSSは2つの要素をブレンドする効果(スティッキー効果)を実現します。

数年前、Taobaoのモバイル版の左下隅に面白い丸いボタンがあったことを覚えています。それをクリック...

Dockerコンテナにvimコマンドがない問題を解決する方法

問題を見つける今日、Docker コンテナ内のファイルを変更しようとしたところ、コンテナ内に vim...

ビジュアルデザインとインタラクションデザインについて

<br />製品設計プロセス全体において、ビジュアルデザインとインタラクションデザインの...

MySQL データベース ターミナル - 一般的な操作コマンド コード

目次1. ユーザーを追加する2. ユーザー名とホストを変更する3. パスワードを変更する4. ユーザ...

HTML をホームページとして設定し、お気に入りに追加_Powernode Java Academy

IE ブラウザで「ホームページとして設定」および「お気に入りに追加」機能を実装する方法解決:指定さ...

Vue が 4 レベルのナビゲーションと検証コードを実装する方法の例

効果: まず5つのVueインターフェースを作成する1.home.vueページ <テンプレート&...