User Debug日志条目所提供的信息可用于确定程序的崩溃位置。一些可用的工具可帮助解决您可能会遇到的各种程序终止问题。我们将在本文中逐步介绍那些工具。
首先,让我们检查一下该日志条目中的用户 PSW。该 PSW 包含指令地址、状态码以及关于机器状态的其他信息。眼下,我们仅关心指令地址(第33至第63位)。为简化起见,让我们假设用户PSW是 070dc000 80400618。记住,我们是在考察一个 ESA/390(31 位寻址)PSW。第32位不是指令地址的一部分,它是指示 31 位寻址模式的标志,但是在研究 PSW 值时必须处理它。为了获得实际的指令指针,可把PSW的第二个字减去 0x80000000。结果是一个指令地址 0x400618。为了定位代码,您需要可执行文件中的一些信息。首先使用readelf来打印一些程序头信息。
Elf file type is EXEC (Executable file)
Entry point 0x400474
There are 6 program headers, starting at offset 52
Program Headers:
Type
Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
PHDR
0x000034 0x00400034 0x00400034 0x000c0 0x000c0 R E 0x4
INTERP
0x0000f4 0x004000f4 0x004000f4 0x0000d 0x0000d R 0x1
[Requesting program interpreter: /lib/ld.so.1]
LOAD
0x000000 0x00400000 0x00400000 0x00990 0x00990 R E 0x1000
LOAD
0x000990 0x00401990 0x00401990 0x000fc 0x00114 RW 0x1000
DYNAMIC
0x0009ac 0x004019ac 0x004019ac 0x000a0 0x000a0 RW 0x4
NOTE
0x000104 0x00400104 0x00400104 0x00020 0x00020 R 0x4
Section to Segment mapping:
Segment Sections...
00
01
.interp
02
.interp .note.ABI-tag .hash .dynsym .dynstr .gnu.version
.gnu.version_r .rela.got .rela.plt .init .plt .text .fini .rodata
03
.data .eh_frame .dynamic .ctors .dtors .got .bss
04
.dynamic
05
.note.ABI-tag