利用dmesg排查段错误原因(Geant 4程序)

参考博文:

【1】段错误原因分析和查找.
【2】段错误排查 —— 利用dmesg.
【3】linux调试:dmesg 查看程序崩溃原因分析方法之一 .

下面的内容为博主在Geant 4程序设计中遇到的问题。

问题描述

Geant 4 分析闪烁体荧光光子的相关问题,程序计算到某一个event时,程序自动终止,输出错误信息“段错误(核心已转储)”。
在单个程序的“段错误”问题分析中,可以查看core文件(linux系统默认不生成core文件,采用ulimit -c 1024 命令开启并设置文件最大大小),但是在Geant4程序中没有core文件输出(具体原因不知)。因此,在Geant 4程序报错时,输入dmesg,打印错误信息:

$ dmesg
$ exampleB4d[12964]: segfault at 78 ip 00007f2c489cf556 sp 00007f2c3d76b070 error 4 in libG4materials.so[7f2c4898e000+7c000]

反汇编文件内容:( 重点查看前两篇参考文章)

0000000000054530 <_ZN25G4MaterialPropertiesTable11GetPropertyEib>:
   54530:	41 57                	push   %r15
   54532:	41 56                	push   %r14
   54534:	41 55                	push   %r13
   54536:	41 54                	push   %r12
   54538:	55                   	push   %rbp
   54539:	53                   	push   %rbx
   5453a:	89 f3                	mov    %esi,%ebx
   5453c:	48 81 ec 98 01 00 00 	sub    $0x198,%rsp
   54543:	64 48 8b 04 25 28 00 	mov    %fs:0x28,%rax
   5454a:	00 00 
   5454c:	48 89 84 24 88 01 00 	mov    %rax,0x188(%rsp)
   54553:	00 
   54554:	31 c0                	xor    %eax,%eax
   54556:	48 8b 47 78          	mov    0x78(%rdi),%rax            # 错误指针所知位置
   5455a:	48 85 c0             	test   %rax,%rax
   5455d:	74 69                	je     545c8 <_ZN25G4MaterialPropertiesTable11GetPropertyEib+0x98>
   5455f:	48 8d 77 70          	lea    0x70(%rdi),%rsi
   54563:	48 89 f1             	mov    %rsi,%rcx
   54566:	eb 14                	jmp    5457c <_ZN25G4MaterialPropertiesTable11GetPropertyEib+0x4c>
   54568:	0f 1f 84 00 00 00 00 	nopl   0x0(%rax,%rax,1)

解决方法

对于博主遇到的问题,解决方法是,把调用nist的材料material改为自定义的材料。

上一篇:redis6.0.5之Rax阅读笔记1-相关数据结构和部分辅助函数


下一篇:浅谈「内存调试技术」