我們在HPUX PARISC編譯器和鏈接器ACC編譯的C/C++ HPUX PA-RISC應用程序RELEASE演示中遇到隨機發生的段錯誤,該編譯器和鏈接器ACC加載編譯並與ACC鏈接的HPUX PA_RISC RELEASE共享對象sl(即如此)。我們無權訪問pmap或HPUX wdb。所以我們使用惠普專有的調試器adb。下面是我們如何使用利用亞行:是否可以在不使用pmap或wdb的情況下確定HPUX PA-RISC seg故障的原因?
$ 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)
在這一點上出現的違規指令以某種方式與上述的組裝insruction。我們的第一個問題是1416
是十進制格式還是十六進制格式。
我們的第二個問題是,程序計數器1E3C是否準確,並且可以被用於獲得關於問題的代碼C/C++源極線的進一步信息/
我們的第三個問題是,假定1416
是十進制格式,那麼如下所示,寄存器1($r1)
包含0x40015b90
。使用十六進制算術1416
(基數10(即,十六進制0x588
))+ 0x40015b90
等於0x40016118
。接下來,我們使用nm來查找與0x40016118
關聯的共享對象庫地址/ C++損壞符號。
$ 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文件時,我們無法神祕地找到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
總之,我們試圖確定是否有可能找到導致此隨機seg錯誤的違規C/C++源代碼行。使用Centos Linux和valgrind --tool=memcheck
我們找不到任何緩衝區溢出。謝謝。
這裏是HP-UX工作站和編譯器的一些信息。$ UNAME -a HP-UX紫色B.11.11ü9000/800 1996057826無限制的用戶許可證$ ACC-V ACC :HP ANSI C++ B3910B A.03.70。謝謝。 – Frank 2012-07-09 19:30:10