ホームページ > システムチュートリアル > Linux > Linuxカーネルのデバッグ出力機能:printkの詳細説明

Linuxカーネルのデバッグ出力機能:printkの詳細説明

PHPz
リリース: 2024-02-14 20:33:14
転載
1322 人が閲覧しました

printk は、Linux カーネルで最も一般的に使用されるデバッグ関数の 1 つであり、変数の値、関数の実行フロー、エラーの原因などのデバッグ情報をカーネル バッファまたはコンソールに出力するために使用されます。等printk の利点は、シンプルで使いやすく、追加の機器やドライバーを必要としないことです。 printk の実装には、カーネル バッファ、ログ レベル、フォーマット文字列などの概念が含まれます。この記事では、Linux カーネルのデバッグ技術である printk の原理と手法を紹介し、その使用方法と注意点を例を挙げて説明します。

Linuxカーネルのデバッグ出力機能:printkの詳細説明

1. はじめに (s3c2440 linux に基づく)

カーネル デバッグ テクノロジの中で、最も単純なのは printk の使用です。その使用法は、C 言語アプリケーションでの printf の使用に似ています。アプリケーションは stdio.h のライブラリに依存しますが、Linux にはそのようなライブラリはありませんLinux カーネルでこの printk を使用するには、カーネルの実装をある程度理解する必要があります。

printf と printk の違い: printk は先頭に "" スタイルの文字を追加します。N の範囲は 0 ~ 7 で、この情報のレベルを示します。

printk(""....); の n の場合

カーネル ファイル Printk.c (カーネル) の console_loglevel レベルを 7.

に初期化します。 リーリー

2. コマンド cat /proc/sys/kernel/printk:

を使用してレベル構成を確認します。

# cat /proc/sys/kernel/printk
7 4 1 7

7 4 1 7 は、console_loglevel、default_message_loglevel、minimum_console_loglevel、default_console_loglevel に対応します。

3. レベル構成を変更します:

#echo “1 4 1 7”>/proc/sys/kernel/printk これら 4 つの値を変更します。console_loglevel が 1 に設定されている場合、すべてのデバッグ情報が出力されます。

4. printk 関数レコードの名前と使用法

カーネル ファイル内: Kernel.h (include\linux) は 0 から 7 までの 8 レベルの名前を定義します。 リーリー

printk を使用する:

リーリー

①と②では、出力された情報を確認するためにバッファ log_buf 内のデータをチェックする必要があります。 #dmesg

コマンドを使用する必要があります。 リーリー

cat /proc/kmsg& を使用してバックグラウンドで実行し、デバッグ情報をリアルタイムで出力することもできます。 ②の__FILE__、

FUNCTION

、__LINE__がそれぞれそのファイル、その関数、どの行に対応します。とても実用的です。 リーリー

5. シリアル ポートと printk 関数の関係:

リーリー シリアル ポート出力関数は s3c24xx_serial_console_putchar 関数を呼び出します

リーリー

この関数はハードウェアに関連しています。レジスタを読んで、データが送信されたかどうかを確認します。最後に、データをバイトごとにレジスタに書き込みます。s3c2440 シリアル ポート コントローラが自動的にデータを送信します。

リーリー

Linux で uboot の console=ttySAC0 がシリアルポート 0 として認識される場合、/kernel/printk.c,

に次のコードがあります。 リーリー

カーネルの実行開始時、コマンド ライン パラメータ "console=..." が見つかると、データ分析のために console_setup 関数が呼び出されます。コマンド ライン パラメータ "console=ttySAC0" の場合、デバイス名 (名前) は ttySAC として解析され、インデックス Index は 0、この情報はタイプ console_cmdline および名前 console_cmdline のグローバル配列に保存されます (注: 配列名は配列タイプと同じです)

後続の register_console(&s3c24xx_serial_console); では、s3c24xx_serial_console 構造体が console_cmdline 配列内のデバイスと比較されます。

①解析された名前は S3C24XX_SERIAL_NAME、つまり「ttySAC」で、console_cmdline のコマンドの名前も「ttySAC」です。

②s3c24xx_serial_console 構造のインデックス Index は -1 です。これは、コマンド ライン パラメーター「console=ttySAC0」のインデックスを使用することを意味します。インデックス = 0

透過本文,我們了解了Linux核心調試技術之printk的原理和方法,它們可以用來實現對核心的調試和輸出。我們應該根據實際需求選擇合適的方法,並遵循一些基本原則,如使用正確的日誌等級,使用正確的格式化字串,使用正確的輸出函數等。 printk是Linux核心中最簡單而有效的調試函數之一,它可以實現對核心的回饋和監控,也可以提升核心的可維護性和可擴展性。希望本文能對你有所幫助與啟發。

以上がLinuxカーネルのデバッグ出力機能:printkの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:lxlinux.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート