0

我们在使用 HPUX PARISC 编译器和链接器 ACC 编译的 C/C++ HPUX PA-RISC 应用程序 RELEASE 演示中遇到随机发生的分段错误,该程序加载使用 ACC 编译和链接的 HPUX PA_RISC RELEASE 共享对象 sl(即如此)。我们无权访问 pmap 或 HPUX wdb。所以我们使用的是惠普专有的调试器 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是十进制格式还是十六进制格式。

我们的第二个问题是程序计数器 1E3C 是否准确,可用于获取有关违规 C/C++ 源代码行的更多信息/

我们的第三个问题是假设1416是十进制格式,那么如下所示寄存器1($r1)包含0x40015b90。使用十六进制算术1416(以 10 为底(即 hex 0x588))+0x40015b90等于0x40016118。接下来,我们使用 nm 来查找与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 文件时,我们无法神秘地找到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

晚上好,我想出了如何使用 HPUX PA-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 .Regards ,Frank Tzepu Chang

$ mdMUReadWriteExample (0) 0xc01fef60 _sigreturn [/usr/lib/libc.2] (1) 0xc2f27b90 _ ct _7CBigNumFv_2 + 0x88 [./libmdMatchup.sl] (2) 0xc2f3c83c RSADecrypt_ FPCcN21Pc + 0x24 [./slmdMatch] ) 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 设置许可证字符串_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 回答