私は組み込みプログラミングに慣れていますが、組み込みプラットフォームで動作する非常に複雑なアプリケーションをデバッグする必要があります。私はJTAGインターフェイスを通してGDBを使います。埋め込みアプリケーションでのメモリの問題をデバッグする方法
予期しない方法でプログラムがクラッシュします。私はこれがいくつかのメモリ関連の問題のために起こると思います。 GDBは、システムがクラッシュした後にメモリを検査することを許可しますか?つまり、完全に応答しません。
私は組み込みプログラミングに慣れていますが、組み込みプラットフォームで動作する非常に複雑なアプリケーションをデバッグする必要があります。私はJTAGインターフェイスを通してGDBを使います。埋め込みアプリケーションでのメモリの問題をデバッグする方法
予期しない方法でプログラムがクラッシュします。私はこれがいくつかのメモリ関連の問題のために起こると思います。 GDBは、システムがクラッシュした後にメモリを検査することを許可しますか?つまり、完全に応答しません。
設定によっては少し異なります。特に、JTAGを使用しているため、プロセッサが例外を検出したときにプロセッサを停止するようにデバッガを設定することができます(たとえば、保護されたメモリに違法にアクセスするなど)。そうでない場合は、例外ハンドラを無限ループに置き換えることができます。その後、例外を手動でアンロールして、プロセッサがクラッシュの原因となっていたことを確認できます。通常は、そのような状況ではメモリにアクセスすることができます.GDBを使って直接調べたり、すべてをファイルにダンプして後で見渡すことができます。
クラッシュした内容によって異なります。システムが無応答(一部の無限ループ、デッドロックなど)の場合、通常はGDBに応答し、バックトレース(コールスタック)などを見ることができます。 システム/バス/ cpuが実際に(低いレベルで)クラッシュすると、おそらく応答しません。この場合、疑わしい場所/変数にブレークポイントを設定し、何が起こっているかを観察することができます。シミュレータ(ISS、RTL - 該当する場合)も、HWとの動作を比較するのに便利です。
どのプロセッサを使用していますか? – TJD
icyflex1(http://www.csem.ch/docs/Show.aspx/9224/docname/CSEM-STR08-Page%2023.pdf)と呼ばれる32ビットプロセッサで、GNUベースのツールチェーンを使用しています。 – ricc
残念ながら、そのドキュメントには、デバッグ用のCPU機能について何も言及していません。 Carl Norum氏が言及しているように、通常は例外をキャッチし、CPUの状態を検査します。例外に当たったときのPCの特定をCPU固有の方法で行うことができます。いくつかのプロセッサには、デバッグ/フォルトステータスレジスタがあります。このレジスタは、不正なアドレスがアクセスされたかどうか、コードまたはデータバスだったかどうかなどを通知します。 – TJD