Linux で gdb を使用してコア ファイルをデバッグする方法

Linux で gdb を使用してコア ファイルをデバッグする方法

1.コアファイル

プログラム実行中にセグメンテーション エラー (コア ダンプ) が発生すると、プログラムは実行を停止し、コア ファイルが生成されます。コア ファイルは、プログラムの実行状態のメモリ イメージです。 gdb を使用してコア ファイルをデバッグすると、プログラム セグメンテーション エラーが発生した場所をすばやく見つけることができます。もちろん、実行可能プログラムをコンパイルするときにデバッグ情報を生成するには、-g コンパイル オプションを追加する必要があります。

プログラムがアクセスするメモリがシステムによって割り当てられたメモリ領域を超えると、セグメンテーション エラー (コア ダンプ) が発生します。したがって、セグメンテーション エラーが発生する主な状況は次のとおりです。

(1)存在しないメモリアドレスにアクセスする。
(2)システム保護されたメモリアドレスへのアクセス
(3)配列の範囲外アクセス等

コアダンプはコア ダンプとも呼ばれます。プログラム実行中に例外が発生し、プログラムが異常終了すると、オペレーティング システムはプログラムの現在のメモリ状態をコア ダンプと呼ばれるコア ファイルに保存します。

コアとはコアメモリのことで、コイルで作られたメモリです。半導体産業が活況を呈している現在、コアメモリを使用する人はいなくなりました。しかし、多くの場合、メモリは依然としてコアと呼ばれています。

2. コアファイルが生成されるかどうかを制御する

(1)ulimit -cコマンドを使用して、コアファイル生成スイッチを表示します。結果が 0 の場合、この機能は無効になっており、コア ファイルは生成されないことを意味します。

(2)ulimit -c filesizeコマンドを使用して、コアファイルのサイズを制限します(ファイルサイズはKB単位です)。生成された情報がこのサイズを超えると切り捨てられ、不完全なコア ファイルが生成されます。このコア ファイルをデバッグすると、gdb はエラーを表示します。たとえば、ulimit -c 1024 です。

(3)ulimit -c unlimitedを使用すると、コアファイルのサイズは無制限になります。

ターミナルでのコマンド ulimit -c unlimited は一時的な変更に過ぎず、再起動後は有効になりません。永続的な変更を行うには、次の 3 つの方法があります。

(1)/etc/rc.localにulimit -c unlimitedという行を追加する

(2)/etc/profileにulimit -c unlimitedという行を追加する

(3)/etc/security/limits.confの末尾に次の2行を追加します。

@root ソフトコア無制限
@root ハードコア無制限

3.コアファイル名と生成パス

core のデフォルトのファイル名は core.pid です。pid はセグメンテーション エラーを生成するプログラムのプロセス ID を指します。
デフォルトのパスは、セグメント違反を生成したプログラムの現在のディレクトリです。

コア ファイルの名前と生成パスを変更する場合、関連する構成ファイルは次のとおりです。
/proc/sys/kernel/core_uses_pid: 生成されたコア ファイルのファイル名に拡張子として pid を追加するかどうかを制御します。追加される場合、ファイルの内容は 1 になり、追加されない場合は 0 になります。

/proc/sys/kernel/core_pattern: フォーマットされたコア ファイルの場所とファイル名を設定できます。たとえば、元のファイルの内容は core-%e です。
次のように変更できます:
echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
生成されたコア ファイルは /corefile ディレクトリに保存され、生成されたファイル名は core-command name-pid-timestamp になります。

パラメータのリストは次のとおりです。

%p - ファイル名にPIDを挿入
%u - 現在の uid をファイル名に挿入します
%g - 現在のGIDをファイル名に挿入
%s - コアダンプの原因となったシグナルをファイル名に挿入します
%t - コアダンプが発生したUNIX時間をファイル名に挿入します。コアファイルが生成されたUNIX時間を追加します。
%h - コアダンプが発生したホスト名をファイル名に挿入します
%e - コアダンプ実行可能ファイル名をファイル名に挿入し、コマンド名を追加します。

通常、変更する必要はなく、デフォルト設定を使用できます。

4. gdb のコアファイルのデバッグ手順

gdb を使用してコア ファイルをデバッグし、プログラム内のセグメンテーション エラーの場所を見つける場合、実行可能プログラムは -g コンパイル コマンド オプションを使用してコンパイルする必要があることに注意してください。

gdb のコア ファイルをデバッグするための一般的な手順は次のとおりです。最初の手順が推奨されます。

具体的なステップ 1:

(1) gdbを起動し、コアファイルを入力します。コマンドの形式は、gdb [execファイル] [コアファイル]です。
使用例: gdb ./test test.core.

(2)gdbに入ったら、セグメンテーション違反の場所を探す:whereまたはbt

使用例:

ソースプログラム内の特定のファイルの特定の場所を特定できず、セグメンテーション エラーが発生しました。

具体的なステップ2:

(1) gdbを起動し、コアファイルを入力します。コマンドの形式は、gdb –core=[コアファイル]です。
使用例: gdb –core=test.core。

(2)gdbを入力した後、コアファイルに対応するシンボルテーブルを指定します。コマンドの形式は、file [exec file]です。
使用例:

具体的なステップ3:

(1) gdbを起動し、コアファイルを入力します。コマンドの形式は、gdb -c [コアファイル]です。
使用例: gdb -core test.core.
(2)その他の手順は手順2と同様です。

5. セグメンテーション違反の場所を見つけるための他の方法

gdb を使用してシングルステップ デバッグを実行し、セグメンテーション エラーの場所を見つけることができます。 gdb の使用例の詳細については、以下を参照してください。
Linux での gdb の使用法の簡単な紹介。

上記は、Linux で gdb を使用してコア ファイルをデバッグする方法の詳細です。Linux gdb によるコア ファイルのデバッグの詳細については、123WORDPRESS.COM の他の関連記事をご覧ください。

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

<<:  Day.js をベースにした JavaScript での日付処理のよりエレガントな方法

>>:  MySQLでルートユーザーのパスワードを変更する方法

推薦する

Windows システムの MySQL が中国語を入力および表示できない問題の解決方法

ステップ 1: メモ帳を使用して、MySQL インストール ディレクトリの「my.ini」ファイルを...

Linux に MySQL 8.0.19 をインストールするための詳細な手順と問題解決方法

最近Tencent Cloudサーバーを購入し、環境を構築しました。このメモは、これまで MySQL...

MYSQL ストアドプロシージャと関数の簡単な記述

ストアドプロシージャとは簡単に言えば、これは強力で、JAVA 言語のメソッドに似た比較的複雑な論理関...

jQueryはフォーム検証を実装する

jQueryを使用してフォーム検証を実装します。参考までに、具体的な内容は次のとおりです。登録.ht...

WeChatアプレットのスワイパードットのドットをスライダーに変更する方法

目次背景ターゲット効果アイデア成し遂げるスワイパーは変更を聞きますカスタムドットモジュール変更イベン...

すべてまたは逆の選択機能を実現するJavaScript

この記事では、全選択または選択を反転する機能を実現するためのJavaScriptの具体的なコードを参...

js配列のfind、some、filter、reduceの違いの詳細な説明

Array の filter、find、some、reduce メソッドの違いを区別し、使用シナリオ...

Vueルータールーティングの詳細な説明

目次1. 基本的な使い方2. 注意すべき点3. マルチレベルルーティング(マルチレベルルーティング)...

Vue+Openlayerはグラフィックスのドラッグと回転変形効果を実現します

目次序文関連資料成果を達成する実装手順序文Openlayer には独自の拡張プラグイン ol-ext...

MySQL の遅いクエリを見つける方法

序文誰もが日常業務で SQL の最適化を経験したことがあると思います。したがって、最適化の前に、遅い...

Linux で MySQL をインストールする簡単な方法

Linux に MySQL をインストールする方法をオンラインで検索すると、多くの方法が表示されまし...

リンク更新ページと js 更新ページの使用例

1. リンクの使用方法:コードをコピーコードは次のとおりです。 <a href="j...

JavaScriptイベント実行メカニズムの深い理解

目次序文ブラウザJS非同期実行の原理ブラウザのイベントループ実行スタックとタスクキューマクロタスクと...

vue3のテレポート瞬間移動機能の使い方を詳しく解説

vue3テレポート瞬間移動機能の使用は参考用です。具体的な内容は次のとおりです。テレポートは通常、瞬...

Windows Server 2008 R2 に MySQL 5.7.10 をインストールする手順

MSIインストールパッケージを使用してインストールするご使用のオペレーティング システムに応じて、対...