HPUX PARISC コンパイラとリンカー ACC でコンパイルされた C/C++ HPUX PA-RISC アプリケーション RELEASE デモで、ランダムに発生するセグメンテーション エラーが発生します。これは、ACC でコンパイルおよびリンクされた HPUX PA_RISC RELEASE 共有オブジェクト sl(ie so) をロードします。pmap または HPUX wdb にはアクセスできません。そのため、HP 独自のデバッガー adb を使用しています。use adb の使用方法は次のとおりです。
$ adb
PA-32 adb ($h help $q quiit)
adb>!cp mdMUReadWriteExample a.out
!
adb>:r
a.out: running (process 10947)
segmentation violation
stopped at 1E3C: STW r3,1416(r1)
この時点で、問題の命令は何らかの形で上記のアセンブリ命令に関連しているように見えます。最初の質問は1416
、 が 10 進数形式か 16 進数形式かです。
2 番目の質問は、プログラム カウンター 1E3C が正確であり、問題のある C/C++ ソース コード行に関する詳細情報を取得するために使用できるかどうかです。
3 番目の質問は、1416
が 10 進形式であると仮定すると、以下に示すように register1($r1)
には が含まれているということ0x40015b90
です。16 進数の算術演算1416
(基数 10 (つまり hex 0x588
)) + 0x40015b90
equalsを使用し0x40016118
ます。次に、 nm を使用して、 に関連付けられた共有オブジェクト ライブラリ アドレス/C++ マングル シンボルを見つけます0x40016118
。
$ grep -n "4001611" /home/marc/acc3_pa_32bit/cameron_nm.txt
27808:40016118 ? static___soa_RSA_cpp_
27823:40016110 ? static___soa_cDateTime_cpp_
次に、makefile を変更して、組み合わせた逆アセンブリ (C++ ソース コード) を取得します。ただし、生成された 50 個の *.s ファイルをすべて検索すると、不思議なことに .s ファイルが見つかりませんstatic___soa_RSA_cpp_
。ここで重要なステップをスキップしましたか?
adb>$r
pcoqh 0 1E3F
pcoqt 0 1E43
rp 0 0xC0209793
arg0 0 1 arg1 0 7F7F04FC arg2 0 7F7F050 4 arg3 0 7F7F0540
sp 0 7F7F05D0 ret0 0 0 ret1 0 1 dp 0 40016390
r1 0 40015B90 r3 0 7F7F0000 r4 0 4001591 8 r5 0 3C
r6 0 20 r7 0 3E r8 0 7F7F091 0 r9 0 40015918
r10 0 40031918 r11 0 1E800 r12 0 4001611 8 r13 0 400266A4
r14 0 3F r15 0 3F r16 0 3D r17 0 3D
r18 0 3A r19 0 7B03B764 r20 0 0xA98D4 00 r21 0 7F7F0550
r22 0 0 r31 0 1E2B sar 0 23 sr0 0 0xA98D400
sr1 0 3848400 sr2 0 0 sr3 0 0 sr4 0 0xA98D400
要約すると、このランダム セグメント フォールトの原因となっている問題のある C/C++ ソース行を見つけることができるかどうかを判断しようとしています。Centos Linux と valgrind--tool=memcheck
を使用しても、バッファ オーバーランは見つかりません。ありがとうございました。