Linuxカーネルでのアサーションを使用します
-
28-10-2019 - |
質問
質問があります assert()
Linux:カーネルで使用できますか?
いいえの場合、たとえばnullポインターを入力したくない場合、通常どのテクニックを使用しますか?
解決
対応するカーネルマクロはそうです BUG_ON
と WARN_ON
. 。前者は、カーネルをパニックにしてシステムを下げたいときのためです(つまり、回復不可能なエラー)。後者は、カーネルログに何かをログに記録する場合のためです(Viaで表示可能 dmesg
).
@michaelが言うように、カーネルでは、ユーザースペースから来るものを検証する必要があります 扱う, 、それが何であれ。 bug_onとwarn_onは、独自のコードまたはハードウェアの問題でバグをキャッチします。
他のヒント
1つのオプションは、マクロを使用することです BUG_ON()
. 。そうなる printk
メッセージ、そして panic()
(つまり、クラッシュ)カーネル。
http://kernelnewbies.org/kernelhacking-howto/debugging_kernel
もちろん、これは最後の手段のエラー処理戦略としてのみ使用する必要があります(まさに assert
)...
いいえ。カーネルコアで、むしろモジュールで作業していない限り、クラッシュしないように最善を尽くしてください。 abort()
)カーネル。ヌルポインターを使用したくない場合は、 それをしないでください. 。それを使用する前にそれを確認し、その場合はエラーログを作成します。
最も近いもの そうかもしれない あなたが実際に致命的なケースを扱っている場合にやりたい panic()
関数または BUG_ON
と WARN_ON
マクロは、実行を中止し、診断メッセージ、スタックトレース、モジュールのリストを作成します。
さて、Null Poerintを繰り返し回避すると、oopsが生成されます。これは、問題のあるコードを見つけるために使用できます。これで、特定の条件をassert()したい場合は、使用できます
BUG_ON(condition)
あまり致命的ではないメカニズムは、warn_onであり、カーネルをクラッシュせずにバックトレースを生成します。
BUG_ON()
それを行うための適切なアプローチです。条件が真実であることをチェックし、マクロを呼び出します BUG()
.
どのように BUG()
ハンドル残りは次の記事で非常によく説明されています。
私はこのマクロを使用し、bug()を使用しますが、通常はデバッグに使用する情報を追加します。もちろん、編集して詳細情報を含めることができます。
#define ASSERT(x) \
do { if (x) break; \
printk(KERN_EMERG "### ASSERTION FAILED %s: %s: %d: %s\n", \
__FILE__, __func__, __LINE__, #x); dump_stack(); BUG(); \
} while (0)