2016-06-30 10 views
0

「小さな」Linuxを使用するボード上にドライバを開発することは全く新鮮です。私がすべてを作り、PC上の ".bin"ファイルを取得し、ボードに ".bin"をftpすると、システムはうまく動作します。GDBのないボードでLinuxカーネルをデバッグ

問題が発生しました。私はシステムをチェックし、gdbを使うことはできません。だからシステムがクラッシュすると、ちょうど厄介なアドレス情報を提供するコアダンプファイルが提供されます(役に立たないか、少なくとも私はこれをどのように使うべきかわかりません)。

経験豊富なエンベデッドデベロッパーは、何か提案をいただきましたか?どのようにあなたの仕事でデバッグ?

ところで、コンソール印刷のクラッシュ情報にスタック情報とコールトレースが含まれている場合、epcとraは(私はそれを学んだだけです)。 epc(クラッシュしたアドレス)はまだ見つかっていますか?

+0

どのようなデバッグ出力手段がありますか? printf出力に使用できるUARTはありますか?シングルステッピングやメモリ検査のためのJTAGインターフェイス? – Throwback1986

+0

@ Throwback1986私はPCコンソールに物事を印刷するためにUARTを持っていますが、非常に原始的です。そして、私はシステムを遅くする多くの印刷できません –

+0

ちょうどprintkを使用してデバッグはプリミティブと思われるかもしれませんが、コードや状況がブレークポイントを許容しない場合は効果的です。コードを机上でチェックするとバグの99.9%を捕まえることができるので、C(とプログラム/システム)を知ることができます。 (例えば、マニュアルページを読み、すべての顕著なリターンコードをテストする)防衛的に(例えば、assert()の自由使用など)を体系的に記述しなければなりません。コンパイラの警告を修正しました。 debug_flag変数を使用して冗長性を制御し、どのプリントがアクティブであるか非アクティブであるかを制御します(つまり、常にすべてのprintkをアクティブにする必要はありません)。パニックの場合は、冗長パニックを有効にし、記号を削除しないでください。 – sawdust

答えて

2

自分自身を含む多くのカーネル開発者は、デバイスドライバを開発するときにデバッガを使用しません。何年もの間、Linuxはカーネルのデバッグをサポートしていませんでした。現在でも、すべてのCPUアーキテクチャがカーネルのデバッグをサポートしているわけではありません。

最も簡単なことの1つは、printkを使用してイベントをコンソールに記録することです。また、コンソールのUART速度を上げてください。私はしばしば115200ボーを使用します。

一部のCPUアーキテクチャでは、Linuxカーネルがkgdbをサポートしています。

また、私は非常にこれらの2冊読んで、Linuxカーネルの開発者をお勧めしますことで、ジョナサン・コーベット、アレッサンドロRubini、グレッグ・クロー=ハートマン

  • Understanding the Linux Kernelにより、

  • +0

    ありがとうございました!これは、メモリ関連のバグがある場合、実際にクラッシュを引き起こすコード行を見つけるのは非常に難しいでしょうか?お勧めのツールはありますか? –

    関連する問題