私は 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)