Linux カーネル デバイス ドライバー カーネル デバッグ テクニカル ノート集

Linux カーネル デバイス ドライバー カーネル デバッグ テクニカル ノート集
/******************
 * カーネルデバッグ技術 ********************/

(1)カーネルソースコード内のデバッグ関連の設定オプション

カーネル構成オプションには、カーネルのデバッグに関連するいくつかのオプションが含まれており、すべて「カーネル ハッキング」メニューに集中しています。含む:

CONFIG_DEBUG_KERNEL

追加のデバッグ オプションが利用可能になるため、チェックする必要があります。これだけではすべてのデバッグ機能が有効になるわけではありません。

デバッグ オプションの詳細な説明については、ドライバーのマニュアルを参照するか、menuconfig のヘルプ説明を参照してください。

(2)マクロを使ってprintkデバッグ文をグローバルに制御する方法

Makefile と連携することで、c ファイル内に独自のデバッグ ステートメントを定義できます。

(3)straceの使用

strace は、ユーザー空間プログラムによって発行されたすべてのシステムコールをトレースできます。役立つパラメータは次のとおりです。

  • -t は通話が発生した時刻を表示します
  • -T 明示的な呼び出しに費やされた時間
  • -e は、"-e execve" のように、トレースされるシステムコールの種類を制限します。
  • -f すべての子プロセスをトレースする
  • -p 特定のプロセスをトレースします。たとえば、「-p 8856」
  • -o 特定のファイルに情報を出力します

strace は、特にマルチプロセス プログラムの場合、システム コールの微妙なエラーを発見するのに非常に便利です。strace によって出力される戻り値とプロセス pid を通じて、多くの有用な情報を得ることができます。のように:

$>strace -o zht.txt -f ./process_create

(4)ltraceの使用

ltrace は、ユーザー空間プログラムによって発行されたすべての動的ライブラリ関数呼び出しをトレースできます。役立つパラメータは次のとおりです。

  • -t は通話が発生した時刻を表示します
  • -T 明示的な呼び出しに費やされた時間
  • -f すべての子プロセスをトレースする
  • -p 特定のプロセスをトレースする
  • -o 特定のファイルに情報を出力します

(5)Oopsメッセージを確認する

Oops は、何か不幸なことが起こったことをユーザーに通知するカーネルの最も一般的な方法です。通常、oops を送信した後、カーネルは不安定な状態のままになります。

場合によっては、oops によってカーネル パニックが発生し、システム クラッシュにつながることがあります。このような状況には次のようなものがあります。

  • * ロックを保持しているコードでエラーが発生する
  • *ハードウェアデバイスとの通信中にエラーが発生する
  • *割り込みコンテキストでエラーが発生する
  • * アイドルプロセス(0)またはinitプロセス(1)でエラーが発生するのは、カーネルがこれらの2つのプロセスなしでは動作できないためです。

別のプロセスの実行中に oops が発生した場合、カーネルはそのプロセスを強制終了し、実行を継続しようとします。 Oops は、範囲外のメモリ アクセスや不正な命令など、さまざまな理由で発生する可能性があります。

oops に含まれる最も重要な情報は、レジスタ コンテキストと呼び出しトレースであり、次のような oops を人為的に発生させる可能性があります。

if(悪いもの)
 バグ();
//またはBUG_ON(bad_thing);

panic() を使用すると、より深刻なエラーを引き起こすことができます。panic() を呼び出すと、エラー メッセージが表示されるだけでなく、システム全体が停止します。極めて悲惨な状況でのみ使用してください:

if(ひどいもの)
 panic("foo は %ld です!\n", foo);

場合によっては、スタック情報を印刷するだけでも、dump_stack() などのテストに役立つことがあります。

 if(!debug_check){
  printk(KERNEL_DEBUG "情報を提供してください\n");
  ダンプスタック();
 }

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。

以下もご興味があるかもしれません:
  • Linux カーネル デバイス ドライバーのメモリ管理に関する注意事項
  • Linux カーネル デバイス ドライバー カーネル時間管理に関する注意事項
  • Linux カーネル デバイス ドライバー キャラクタ デバイス ドライバー ノート
  • Linux カーネル デバイス ドライバー仮想ファイル システムに関する注意事項
  • Linux カーネル デバイス ドライバー カーネル リンク リストの使用上の注意
  • Linux カーネル デバイス ドライバー proc ファイル システム ノート
  • Linuxカメラドライバの書き方の詳細説明
  • Linux におけるドライバモジュールのパラメータ転送プロセスの分析

<<:  Vueでパスワードの表示と非表示機能を実装するアイデアを詳しく解説

>>:  mysql5.7 でユーザーの初期パスワードを変更する方法

推薦する

CSS でフッターの「下部吸収」効果を実現

よく遭遇する問題: 下部の要素を「下部に貼り付ける」効果を CSS でどのように実現するか。この記事...

Reactはラジオコンポーネントのサンプルコードを実装します

この記事の目的は、最も明確な構造を使用していくつかのコンポーネントの基本機能を実装することです。皆さ...

MySQLで偽または真を保存する方法

MySQL ブール値、偽または真を格納つまり、データベースに保存されるブール値は 0 と 1 であり...

uni-appのスタイルの詳細な説明

目次uni-app のスタイル要約するuni-app のスタイルsassプラグインは公式ウェブサイト...

Vue で $attrs と $listeners を使用するチュートリアル

目次導入例要約する導入$属性すべての親コンポーネントのプロパティを継承します (props を通じて...

MySQL 8.0 のデフォルトのデータディレクトリを変更する (設定なしの簡単な操作)

使用シナリオ: Alibaba Cloud を使用しており、データディスクを別途購入しました (大容...

Angular Cookie の読み取りおよび書き込み操作コード

Angular Cookie の読み取りおよび書き込み操作のコードは次のようになります。 var a...

DockerコンテナのIPアドレスを取得する方法の詳細な説明

1.コンテナに入った後 /etc/hosts を cat するコンテナ自体の IP アドレスと (-...

nginx高可用性クラスタの実装プロセス

この記事は主に、nginx 高可用性クラスタの実装プロセスを紹介します。この記事のサンプルコードは非...

Zabbix と bat スクリプトを組み合わせて複数のアプリケーションの状態を監視する方法

シナリオシミュレーション:国内企業の中には、重要な業務をサポートするために特定のウィンドウ プログラ...

MySQLの使い方の詳細な説明

目次1. はじめに2. 本文2.1 Where句の位置2.2 演算子2.3 NULL値1. はじめに...

CSS3 のフィルタプロパティの使用に関する詳細な説明

最近、イントラネットポータルを修正していたときに、フィルターを使用する必要がある箇所に遭遇しました。...

CocosCreator スケルトンアニメーション ドラゴンボーン

CocosCreator バージョン 2.3.4ドラゴンボーンアニメーションキールアニメーションを ...

CentOS 7にDockerをインストールする

Linuxシステムをお持ちでない場合は、ダウンロードとインストールについてはhttps://www....

docker compose を使用して consul クラスタ環境を構築する例

領事の基本概念サーバーモードとクライアントモードサーバー モードとクライアント モードは、consu...