1

AIX マシンから生成されたコア ファイルをデバッグできません。

uname -a
AIX dev 1 6
file /usr/bin/ld
/usr/bin/ld: executable (RISC System/6000) or object module

oslevel -g
Fileset - bos.rte
Actual Level - 6.1.7.15

以下は、生成されたコア ファイルからの gdb トレースです。

gdb A_CustInstr core
This GDB was configured as "powerpc-ibm-aix5.1.0.0".
Core was generated by A_CustInstr. Program terminated with signal 11, Segmentation fault.
#0 0x09000000007e4b70 in ?? ()
(gdb) bt
#0 0x09000000007e4b70 in ?? ()
#1 0xffffffffffffffff in ?? ()
#2 0x09000000007e43ec in ?? ()
#3 0x090000000002bab0 in ?? ()
#4 0x09000000033940c0 in ?? ()
#5 0x0900000003400d54 in ?? ()
#6 0x0900000003394444 in ?? ()
#7 0x00000000000047e0 in ?? ()
Backtrace stopped: previous frame inner to this frame (corrupt stack?)
有効な情報を取得するには?

4

1 に答える 1

1

レジスターをダンプして、iar を見つけます。次に、iar が指しているアドレスをコードおよび ascii としてダンプできるかどうかを確認します。C コードを使用している場合 (ctr0 やあいまいなライブラリを使用していない場合)、関数の名前は関数の末尾に表示されます。

次に、その関数にブレークポイントを設定するか、iar がある場所の 1 つか 2 つ前の命令にブレークポイントを設定できます。また、iar が一貫して同じ場所にあるかどうかを確認するために、6 回実行します。

今説明したコマンドと構文を理解するには、gdb を十分に使用していません。

コードの動作を理解するには、最適化せずに再コンパイルする必要がある場合があります。

iar がまったく役に立たない場合は、lr を見てください。それも役に立たない場合は、スタックのデコードを手動で開始します。r1 はスタック フレームを指します。r1[0] は、次のスタック フレームへのポインタです。r1[2] は戻りアドレスです。最初のスタック フレームの戻りアドレスは、最適化されたコードではおそらく有効ではありません。これらすべてが失敗した場合は、gdb または printf を使用したトレースにフォールバックする必要があります。

私が考えることができる唯一の AIX 固有の調整は、フルコアがオンになっていることを確認することです: lsattr -Elsys0 -a フルコアですが、gdb から実行している場合は問題ありません。

最後に: iar を見つけて、それが指している命令をデコードした場合は、その命令が参照しているレジスタを調べてください。これにより、障害の原因が正確にわかります (触れることができない場所からのロードまたはへの格納)。変更できない場所)。これにより、プログラムのどこにいて、何が問題なのかについての手がかりが得られる場合があります。

幸運を

于 2013-05-12T03:47:09.343 に答える