2017-03-21 4 views
0

私は、pltルーチンの呼び出しでrtlシミュレーション中にセグメント化エラーをデバッグする必要があるtestbench環境で作業しています。このpliルーチンは、ファイル(routines.so)に定義されています。これは、デザインとテストベンチ環境のvcsコンパイル後に生成されたシミュレーション実行ファイルにリンクされています。シミュレータ実行ファイルの名前はsimvです。 C sideで中断したい機能がbadfunction()であるとします。これはVerilog側で$badfunction()と呼ばれています。デバッグをサポートしてroutines.soをコンパイルしました。Verilog pliインターフェイス経由で呼び出される.soファイルで定義された関数にブレークポイントを設定する方法

シミュレーションを実行しているvcs simvシミュレータ実行ファイルにgdbが添付されています。routines.soが読み込まれ、シンボルが読み込まれています。私はinfo sharedを実行してこれをチェックします。

今私はこのinfo address badfunctionのようなシンボルbadfunctionを探します。私はこのようなメッセージを受け取ります。 Symbol "badfunction" is at 0x156bea0 in a file compiled without debugging これは、私には、badfunctionにブレークポイントを置くと、正しい場所に私を得ることができないと思っています。だからbadfunctioninfo symbol 0x156bea0を参照しています。これは私にメッセージbadfunction in section .text of /home/simulations/rtl/build/simvを与えます。したがって、badfunctionsimvに記載しています。

ブレークポイントを正しい場所に配置するには、シミュレーションが失敗のポイントに達するまでに約10時間かかります。ブレークポイントをbadfunctionroutines.soに配置するにはどうすればよいですか? 関数名badfunctionはマングルされていません。 routines.soを逆アセンブルしてシンボルを見ることができます。 routines.soで関数を探すようにgdbに指示するにはどうすればよいですか?

+0

私は '.so'ファイルにブレークポイントを置くことはできません。試してからしばらく時間がかかりましたが、私はあなたが 'routines.so'のソースファイルでvcsをコンパイルすることができると信じています。これにより、pliのためにブレークポイントを使うことができます。 – Greg

+0

@Greg '.so'ファイルにブレークポイントを置くのと同じであるかどうかはわかりませんが、それは近いものだと思います。私は、 'bad function'のように見えるシンボルのすべてのアドレスを与えた' info function badfunction'を使用しました。最初のステップで 'address 'が得られた' info symbol

'と続きました。これは、どのファイルシンボルが定義されているかに関する情報を私に提供しました。このようにして、どのアドレスにブレークポイントを置く必要があるのか​​がわかりました。それは '0xpreferred_address'でした。今や私は 'break * 0xpreferred_address'を実行しなければならず、' .so'の正しい場所にブレークポイントを持っていました。 – Gautam

答えて

0

gdb 7.4からは、break functionに応答して、gdbはすべての一致する関数にブレークポイントを設定します。だから、break badfunctionあなたがしたいことをする必要があります。

しかし、デバッグしたい場所に到達するまでに10時間かかるため、適切なことが起こっていることを確認するために、最初にできることがいくつかあります。

まず、.soにdebuginfoがあることを確認します。これを行う最も信頼性の高い方法は、ロードされる.so(つまり、どこかにインストールされている場合、開発コピーではなくインストールされたコピーをチェックする)を直接調べることです。objdumpまたはreadelfを使用します。私は通常、ちょうどreadelf -wi whatever.soをやります。もしそれがたくさんのものをダンプすれば、あなたはdebuginfoを持っています。

次に、ブレークポイントが正しく設定されていることを確認することができます。 .soのは、実行ファイルにリンクされている場合、これは簡単です。この時点で

$ gdb whatever 
(gdb) break badfunction 
(gdb) start 

、すべての共有ライブラリにリンクされ、ロードされているでしょうし、あなたがこれを行うことができます。

(gdb) info break 

...そして結果として得られた健全性のためのブレークポイントを調べてください。あなたが上に述べたことに基づいて、badfunctionには2つの場所が設定されているはずです。

.soが結果として得られる実行可能ファイルにリンクされていない(実際にはわかりませんが)場合は、もう少し複雑です。 1つのアプローチは、catch load、次にcontinueを実行して、目的のライブラリがロードされ、ブレークポイントがgdbで再解決されるまで実行します。上記のように調べてください。

+0

はい、あなたが言いました。実際、私はこれが以前に起こるのを見ていて、試してみることは考えていませんでした。私は、いくつかの行のために参照するためにいくつかの行を貼り付けます。私がしなければならなかったのは、不要なブレークポイントを無効にすることでした。 '2.1 n 0x000000000152ec10 2.2 y 0x00007ffe89909070 'ありがとうございました。 – Gautam

+0

私は試して働いたことがもう一つあります。私は、 'bad function'のように見えるシンボルのすべてのアドレスを与えた' info function badfunction'を使用しました。最初のステップで 'address 'が得られた' info symbol

'と続きました。これは、どのファイルシンボルが定義されているかに関する情報を私に提供しました。このようにして、どのアドレスにブレークポイントを置く必要があるのか​​確かめました。 – Gautam

関連する問題