0

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)) + 0x40015b90equalsを使用し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を使用しても、バッファ オーバーランは見つかりません。ありがとうございました。

4

1 に答える 1

0

こんばんは、HPUXPA-RISCを使用してセグメンテーションフォールトスタックトレースを取得する方法を理解しました。4つの手順が必要です1)#include "unwind.h" #include "signal.h" 2)extern "C"を定義しますU_STACK_TRACK(int)関数プロトタイプ3)メイン関数でSIGSEGVハンドラーを宣言します:signal(SIGSEGV、U_STACK_TRACE )。4)makefileで、libclにリンクします。よろしく、Frank Tzepu Chang

$ mdMUReadWriteExample(0)0xc01fef60 _sigreturn [/usr/lib/libc.2](1)0xc2f27b90 _ ct _7CBigNumFv_2 + 0x88 [./libmdMatchup.sl](2)0xc2f3c83c RSADecrypt_ FPCcN21 )0xc2f314ec DecryptLicense _9mdLicenseFPCcPc + 0x44の[./libmdMatchup.sl](4)0xc2f31280 DecryptDecodeTest_ 9mdLicenseFPCcT1 + 0x40の[./libmdMatchup.s L](5)0xc2f30c3c TestLicense _9mdLicenseFPCc + 0xb4 [./libmdMatchup.sl](6)0xc2d783bc SetLicenseString_ 12cBatchDedupeFPCc + 0x5c[./libmdMatchup。sl](7)0xc2d6c908 SetLicenseString_13mdMUReadWriteFPCc + 0x90 [./libmdMatchup .sl](8)0x0000376c main + 0x68 [./mdMUReadWriteExample](9)0xc01409f8 _start + 0xa0 [/usr/lib/libc.2](10)0x00002008 $ START $ +0x178[。 / mdMUReadWriteExample]セグメンテーション違反(コアダンプ)

于 2012-07-09T23:54:59.493 に答える