CBA

精华推荐:打败Linux系统中的Bug (1)

2019-09-13 19:28:10来源:励志吧0次阅读

调试zSeries上的Linux应用程序类似于调试其他体系结构上的Linux应用程序。对于有经验的Linux开发人员,最大的挑战是理解新的系统体系结构。对于刚接触Linux的大型机开发人员,掌握新的调试工具似乎是一项令人畏惧的任务。不要害怕。本文将提供一些有用的提示来帮助您入门。 学问来自实践,但是对于调试工具,在没有出现问题而迫使您去修复它们之前,“实践”是不会发生的。考虑到这点,下面将提供让您入门的“速成”指南。 User Debug 日志记录 调试一个崩溃的程序的第一步是弄清哪里出了错。zSeries 上的Linux内核具有这样一个内置特性,它在用户进程崩溃时记录一些基本的调试信息。要启用这个特性,请以 root 用户身份执行如下命令: echo 1 >> /proc/sys/kernel/userprocess_debug

当某个进程崩溃时,日志文件(/var/log/messages)中就会给出附加的信息,包括程序终止原因、故障地址,以及包含程序状态字(PSW)、通用寄存器和访问寄存器的简要寄存器转储。 Mar 31 11:34:28 l02 kernel: User process fault: interruption code 0x10Mar 31 11:34:28 l02 kernel: failing address: 0Mar 31 11:34:28 l02 kernel: CPU: 1Mar 31 11:34:28 l02 kernel: Process simple (pid: 30122, stackpage=05889000)Mar 31 11:34:28 l02 kernel:Mar 31 11:34:28 l02 kernel: User PSW: 070dc000 c00ab738Mar 31 11:34:28 l02 kernel: task: 05888000 ksp: 05889f08 pt_regs: 05889f68Mar 31 11:34:28 l02 kernel: User GPRS:Mar 31 11:34:28 l02 kernel: 00000000 004019a0 004019a0 00000000Mar 31 11:34:28 l02 kernel: 00000003 c00ab732 004008f8 00400338Mar 31 11:34:28 l02 kernel: 40018ffc 0040061c 40018e34 7ffff800Mar 31 11:34:28 l02 kernel: 00400434 80400624 8040066e 7ffff800Mar 31 11:34:28 l02 kernel: User ACRS:Mar 31 11:34:28 l02 kernel: 00000000 00000000 00000000 00000000Mar 31 11:34:28 l02 kernel: 00000001 00000000 00000000 00000000Mar 31 11:34:28 l02 kernel: 00000000 00000000 00000000 00000000Mar 31 11:34:28 l02 kernel: 00000000 00000000 00000000 00000000Mar 31 11:34:28 l02 kernel: User Code:Mar 31 11:34:28 l02 kernel: 44 40 50 00 07 fe a7 4a 00 01 18 54 18 43 18 35a8 24 00 00

图 1图 1 表明程序(名为“simple”)以一个程序中断代码 0x10 终止(操作系统原理表明这是一个段转换错误),而故障地址为 0。毫无疑问,有人使用了空指针。现在我们知道发生了什么,下面需要弄清它发生在何处。 基本的诊断 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 0x400474There are 6 program headers, starting at offset 52Program 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

图 2

小孩肚子疼不消化怎么办
心肌梗塞的最佳治疗
双侧颈动脉硬化严重吗
三个月宝宝咳嗽怎么办
分享到: