組み込みLinux上で軽量のデバッグ
-
11-09-2019 - |
質問
私は小さなLinuxベースのSBC(〜32MBのRAM)上で動作するアプリケーションを開発しています。悲しいことに、私のアプリは最近、もうGDBの下で実行するには大きすぎました。誰もが、私は、組み込みLinuxで使用できる任意の良い、軽量のデバッグ方法を知っていますか?でも、非常に参考になるスレッドのスタックトレースを表示することができるという。
私は、このアプリケーションはC ++で書かれており、複数のスレッドを実行するので、gdbserverを、それがマルチスレッドのアプリケーションでは動作しないよう無行くではありませんされていることを言及する必要があります。
事前のおかげで、
マハ
解決
gdbserverをは間違いなく、私は> 25個のスレッドを今すぐ埋め込まれたプロジェクトに取り組んでいると私たちはすべての時間をgdbserverを使用して、マルチスレッド・アプリケーションで動作します。
info threads
システム内のすべてのスレッドが一覧表示されます。
thread <thread number from info threads>
実行のスレッドに切り替えます。
thread apply XXX <command>
また、「すべて」することができXXXで指定されたスレッド上で実行されます。あなたが実行中のすべてのスレッドからバックトレースをしたい場合は、そう
thread apply all bt
あなたは、彼らがシングルスレッドのプロセスと同じように、すべての一般的なコマンドが動作与えられたスレッドの実行フローにしていたらます。
他のヒント
私はQEMUのようなエミュレータでアプリケーションを実行し、その上でGDB(またはvalgrindのようなもの)を実行しているようなハックをしている人々を聞きました。それは痛みを伴う聞こえますが、それが動作するかどうか....
あなたはlibunwindの(スタックトレースを取得する)とprintfスタイルのログとどこに行くか?
シリアルポートの印刷は、私は考えることができる最も軽量です~~~ 簡単にホストPCで見て、あなたのアプリケーション内の、シンプルで軽量なコード~~
私たちは、GPIOポートを使用し、それを使用して、シリアルポートをシミュレートしたら、あなたは、シリアルポートを持っていない場合。これはよく完璧に働いたが、だった少し遅い:-( ~~~
あなたがあなた自身のデバッガを構築している理由はありますか?私は、ARMプロセッサ(AT91SAM926x)を使用したLinuxシステムを開発していますし、我々はCodeSourcery社からの両方のコンパイラとデバッガを使用しています。私は、彼らはまだGDB 7とバージョンをリリースしているが、私は何の問題もなくgdbserverのツールを使用してマルチスレッドのC ++アプリケーションをデバッグしていないと思います。
GDBSERVERは確かにマルチスレッド・アプリケーションでは動作しません。しかし、あなたはそれがあなたのターゲットGDBで動作するように得るためにあなたのホストのためのクロスターゲットデバッガをコンパイルする必要があります。
これを行う方法の詳細については、こちらの記事を参照してください。
GDBと