質問

質問があります assert() Linux:カーネルで使用できますか?

いいえの場合、たとえばnullポインターを入力したくない場合、通常どのテクニックを使用しますか?

役に立ちましたか?

解決

対応するカーネルマクロはそうです BUG_ONWARN_ON. 。前者は、カーネルをパニックにしてシステムを下げたいときのためです(つまり、回復不可能なエラー)。後者は、カーネルログに何かをログに記録する場合のためです(Viaで表示可能 dmesg).

@michaelが言うように、カーネルでは、ユーザースペースから来るものを検証する必要があります 扱う, 、それが何であれ。 bug_onとwarn_onは、独自のコードまたはハードウェアの問題でバグをキャッチします。

他のヒント

1つのオプションは、マクロを使用することです BUG_ON(). 。そうなる printk メッセージ、そして panic() (つまり、クラッシュ)カーネル。

http://kernelnewbies.org/kernelhacking-howto/debugging_kernel

もちろん、これは最後の手段のエラー処理戦略としてのみ使用する必要があります(まさに assert)...

いいえ。カーネルコアで、むしろモジュールで作業していない限り、クラッシュしないように最善を尽くしてください。 abort())カーネル。ヌルポインターを使用したくない場合は、 それをしないでください. 。それを使用する前にそれを確認し、その場合はエラーログを作成します。

最も近いもの そうかもしれない あなたが実際に致命的なケースを扱っている場合にやりたい panic() 関数または BUG_ONWARN_ON マクロは、実行を中止し、診断メッセージ、スタックトレース、モジュールのリストを作成します。

さて、Null Poerintを繰り返し回避すると、oopsが生成されます。これは、問題のあるコードを見つけるために使用できます。これで、特定の条件をassert()したい場合は、使用できます

BUG_ON(condition)

あまり致命的ではないメカニズムは、warn_onであり、カーネルをクラッシュせずにバックトレースを生成します。

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

どのように BUG() ハンドル残りは次の記事で非常によく説明されています。

http://kernelnewbies.org/faq/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)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top