/ / Linuxカーネルでのアサーションの使用 - linux、linux-kernel、assert、assertions、assertion

Linuxカーネルでのアサーションの使用 - linux、linux-kernel、assert、assertions、assertion

私は assert() Linuxの場合:カーネルで使用できますか?

もしそうでなければ、例えばNULLポインタを入力したくない場合、どのテクニックを通常使用しますか?

回答:

回答№1の場合は40

対応するカーネルマクロは次のとおりです。 BUG_ON そして WARN_ON。前者は、カーネルパニックを起こしてシステムを停止させたいとき(つまり、回復不可能なエラー)のためのものです。後者は、カーネルログに何かを記録したいときです。 dmesg)。

@Michael氏によると、カーネルでは、ユーザ空間から来たものだけを検証する必要があります。 扱うそれは何でも。 BUG_ONとWARN_ONは、自分自身のコードのバグやハードウェアの問題を捕らえます。


回答№2のための7

1つのオプションは、マクロを使用することです BUG_ON()。そうなる printk メッセージ、その後 panic() (すなわち、クラッシュする)。

http://kernelnewbies.org/KernelHacking-HOWTO/Debugging_Kernel

もちろん、これは最後の手段のエラー処理戦略としてのみ使用するべきです(ちょうど assert)...


回答№3のための5

いいえ、カーネルコアではなく、モジュール上で作業している場合を除き、クラッシュしないように最善を尽くす必要があります(技術的には、 abort())カーネル。 NULLポインタを使用したくない場合は、 それをしない。使用する前に確認し、エラーログがあればエラーログを生成してください。

あなたに一番近いもの かもしれない 実際に致命的なケースを処理している場合は、 panic() 機能または BUG_ON そして WARN_ON 実行を中止して診断メッセージ、スタックトレース、モジュールリストを生成するマクロ。


回答№4の4

さて、ヌルポインタの逆参照はoopsを生成し、問題のコードを見つけるために使用できます。与えられた条件をアサーションしたい場合は、

BUG_ON(condition)

それほど致命的ではないメカニズムはWARN_ONで、カーネルをクラッシュさせずにバックトレースを生成します。


回答№5の場合は0

BUG_ON() それを行うための適切なアプローチです。条件が真であることを確認し、マクロを呼び出します BUG().

どうやって BUG() 残りの部分は次の記事で非常によく説明されています:

http://kernelnewbies.org/FAQ/BUG


答え№6の場合は0

私はこのマクロを使用し、BUG()を使用しますが、私が通常デバッグに使用するいくつかの情報を追加します。

#define ASSERT(x)                                                       
do {    if (x) break;                                                   
printk(KERN_EMERG "### ASSERTION FAILED %s: %s: %d: %sn",      
__FILE__, __func__, __LINE__, #x); dump_stack(); BUG();  
} while (0)