参考博文:
【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改为自定义的材料。