2009-12-01 9 views
5

私は小さなLinuxベースのSBC(〜32MB RAM)で動作するアプリケーションを開発しています。残念なことに、私のアプリは最近、GDBの下で実行するには大きすぎます。誰も、私は組み込みLinuxで使用できる、良い、軽量のデバッグ方法を知っていますか?スレッドのスタックトレースを見ることができても非常に便利です。組み込みLinuxでの軽量デバッグ

私は、このアプリケーションはC++で書かれており、複数のスレッドを実行するので、gdbserverを、それがマルチスレッドのアプリケーションでは動作しないよう無行くではありませんされていることを言及する必要があります。事前に

おかげで、

マハ

+1

あなたはgdbserverを、マルチスレッドアプリケーションでは動作しませんか?このページは、それが動作することを示唆しています:http://www.kegel.com/linux/gdbserver.html。 –

答えて

4

gdbserverは確かにマルチスレッドアプリケーションで動作しますが、私は現在25スレッド以上の組み込みプロジェクトに取り組んでおり、gdbserverは常に使用しています。

info threads 

リストシステム内のすべてのスレッド実行のスレッドに

thread <thread number from info threads> 

スイッチ。

thread apply XXX <command> 

XXXで指定されたスレッドで実行されます。これは 'all'でもかまいません。あなたが望むのであれば、あなたが与えられたスレッドの実行フロー内のすべてのあなたの典型的なコマンドだ後は、すべての実行中のスレッドが

thread apply all bt 

を行うからバックトレースは、彼らがシングルスレッドのプロセスと同じように動作します。

+0

gdb/gdbserverを特別な引数で実行する必要がありますか?私はARMプロセッサで動作しています。私は 'gdbserver localhost:12345 myapp'を実行し、ホスト上で同じバージョンのgdbを実行し、 'target remote 10.0.150.92:12345'というコマンドを入力すると、デバッガは混乱してしまいます。すべてのコンテキストスイッチ、および 'info threads'は実行中のスレッドを1つだけ報告します)。 – Maha

+0

私はデバッグ時に特殊な引数で実行する必要はありません。私たちのプロジェクトもARM上にあります。リモートデバッグのための私のプロセスはあなたのものと同じように聞こえる。ターゲット上の :gdbserverをローカルホスト:ホストで10000 myappの :arm_v5tルGDB myappの ホストgdbのコマンドラインで:あなたは腕が右の構築を意味するGDBの同じバージョンで :リモートをターゲット? コンテキストスイッチ中にSIGUSR1/2などの信号がアプリケーションから取得される理由はありますか?これにより、デバッガが停止します。 ターゲットとホストの両方のアプリケーションは、デバッグシンボルでビルドする必要があります。そのためにホストをNFSマウントします。 – asm

+0

私のホストマシンはx86システムであり、ターゲットシステムはARMプロセッサを実行します。あなたのホストはARMシステムでもありますか?そうでなければ、私はGDBビルドで何かを逃したかもしれません(私はGDB 7.0をARM用に構築し、それをx86用に個別に構築しました)。私のアプリは間違いなくSIGUSR1/2を生成していません - 私は、デバッガが1つのスレッドしか実行していないと思っているので、コンテキストスイッチが壊れていることを確認しました。 – Maha

2

私はQEMUのようなエミュレータでアプリケーションを実行し、その上でGDB(またはvalgrindのようなもの)を実行しているようなハックをしている人々を聞きました。それはうまくいくように思えますが、うまくいくとすれば....

libunwind(スタックトレースを取得する)とprintf形式のログはどこにもありますか?あなたはシリアルポートを持っていない場合は

+0

ポインタをありがとう。私はエミュレータの下で走っているのを見ましたが、それは間違いなく痛みを伴う方法であり、おそらく私が費やすことよりも多くの時間を食べるでしょう。 私は今、printf形式のロギングを行っていますが、これはかなり複雑なアプリケーションであり、最初に問題の原因となっているコンポーネントを正確に把握するのは難しい場合があります。 Libunwindは間違いなく役に立つツールのように見えますが、私はそれを撃つでしょう。 – Maha

1

シリアルポート印刷アプリ~~

内部簡単にホストPCで見られる私は~~~ の考えることができる最も軽量、シンプルかつ軽量コードですいったんGPIOポートを使用してシリアルポートをシミュレートすると、完全にうまくいっていましたが、少し遅いです:-(~~~

0

独自のデバッガーをビルドした理由はありますか?私はARMプロセッサ(AT91SAM926x)を使ってLinuxシステムを開発しており、CodeSourceryのコンパイラとデバッガの両方を使用しています。私は、彼らはまだGDB 7とバージョンをリリースしているが、私は何の問題もなくgdbserverのツールを使用してマルチスレッドのC++アプリケーションをデバッグしていないと思います。

+0

私たちはSBCメーカーが提供するツールチェーンを使用しています。残念ながら、彼らはあらかじめ構築されたGDBを提供していないので、私は自分で行っています。 – Maha

+2

GDBの古いバージョンをビルドすることもできます。 GDB 7は非常に新しく、私は主要なバグ報告を読んだことがあります(ただし、ARMは関係ありません)。バージョン6.7を実行しています。 –

0

GDBSERVERは確かにマルチスレッド・アプリケーションでは動作しません。しかし、あなたのターゲットgdbで動作させるには、ホスト用のクロスターゲットデバッガをコンパイルする必要があります。

それを行う方法の詳細についてはこちらの記事を参照してください。

Remote cross-target debugging with GDB and GDBserver

+0

リンクをありがとう。私はそこの指示に従ったが、彼らは私のために働かなかった。彼の方法で腕固有のバイナリを作成しようとすると失敗しました.Cのコンパイラが実行可能ファイルを生成できないという不満があります。 GDBのビルドプロセスは、通常、クロスコンパイル時に生成される実行可能ファイルをテストしないほどスマートですので、なぜそうするのか分かりません。 – Maha

関連する問題