私は、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
にブレークポイントを置くと、正しい場所に私を得ることができないと思っています。だからbadfunction
はinfo symbol 0x156bea0
を参照しています。これは私にメッセージbadfunction in section .text of /home/simulations/rtl/build/simv
を与えます。したがって、badfunction
をsimv
に記載しています。
ブレークポイントを正しい場所に配置するには、シミュレーションが失敗のポイントに達するまでに約10時間かかります。ブレークポイントをbadfunction
のroutines.so
に配置するにはどうすればよいですか? 関数名badfunction
はマングルされていません。 routines.so
を逆アセンブルしてシンボルを見ることができます。 routines.so
で関数を探すようにgdbに指示するにはどうすればよいですか?
私は '.so'ファイルにブレークポイントを置くことはできません。試してからしばらく時間がかかりましたが、私はあなたが 'routines.so'のソースファイルでvcsをコンパイルすることができると信じています。これにより、pliのためにブレークポイントを使うことができます。 – Greg
@Greg '.so'ファイルにブレークポイントを置くのと同じであるかどうかはわかりませんが、それは近いものだと思います。私は、 'bad function'のように見えるシンボルのすべてのアドレスを与えた' info function badfunction'を使用しました。最初のステップで 'address 'が得られた' info symbol
'と続きました。これは、どのファイルシンボルが定義されているかに関する情報を私に提供しました。このようにして、どのアドレスにブレークポイントを置く必要があるのかがわかりました。それは '0xpreferred_address'でした。今や私は 'break * 0xpreferred_address'を実行しなければならず、' .so'の正しい場所にブレークポイントを持っていました。 – Gautam