Backtrace指向fopen崩溃

时间:2013-05-23 21:49:21

标签: c linux gdb

以下是我最近一次崩溃所带来的回溯。 它指向fopen电话。不知道这里发生了什么。 设备上有足够的空间。 &安培;即使文件不是它们,它也应该返回NULL。

崩溃没有意义。 这是bt

(gdb) bt 
#0  0xb788f50e in __open_nocancel () from /tmp/user_20130523143934/x86/lib/tls/libc.so.6
#1  0xb78453e7 in *__GI__IO_file_open (fp=0x814b0e4, filename=0xb78fc1f5 "/init_log.cfg", posix_mode=-2, prot=438, read_write=8, is32not64=0) at fileops.c:233
#2  0xb784555c in _IO_new_file_fopen (fp=0x814b0e4, filename=0xb78fc1f5 "/init_log.cfg", mode=0x1b6 <Address 0x1b6 out of bounds>, is32not64=1) at fileops.c:332
#3  0xb783d519 in __fopen_internal (filename=0xb78fc1f5 "/init_log.cfg", mode=0xb78fc1f3 "r", is32=1) at iofopen.c:93
#4  0xb783d55f in _IO_new_fopen (filename=0xb78fc1f5 "/init_log.cfg", mode=0xb78fc1f3 "r") at iofopen.c:107
#5  0xb78fbe00 in init_setup (app_uuid=1009, mod_uuid=0, hdl=0xfffffffe) at ../init_setup_api.c:1013
#6  0x0805f431 in main (argc=1, argv=0xbffffa64) at .. vpg_agent.c:307


(gdb) frame 5
#5  0xb78fbe00 in init_setup (app_uuid=1009, mod_uuid=0, hdl=0xfffffffe) at ../init_setup_api.c:1013
1013        if ((fp = fopen(MY_FILE, "r")) == NULL) {
(gdb) l

感谢您的帮助。

PS:还有一件事,它是一个远程映射的文件系统。刚刚了解它。 这可能有所贡献。

1 个答案:

答案 0 :(得分:4)

__open_nocancel通常是系统调用的一个小包装。

以下是我系统上的内容:

(gdb) disas __open_nocancel
Dump of assembler code for function __open_nocancel:
   0x000ddf5a <+0>:     push   %ebx
   0x000ddf5b <+1>:     mov    0x10(%esp),%edx
   0x000ddf5f <+5>:     mov    0xc(%esp),%ecx
   0x000ddf63 <+9>:     mov    0x8(%esp),%ebx
   0x000ddf67 <+13>:    mov    $0x5,%eax
   0x000ddf6c <+18>:    call   *%gs:0x10
   0x000ddf73 <+25>:    pop    %ebx
   0x000ddf74 <+26>:    cmp    $0xfffff001,%eax
   0x000ddf79 <+31>:    jae    0xddfad <open+93>
   0x000ddf7b <+33>:    ret    
End of assembler dump.

您的PC 0xb788f50e很可能与我在0x000ddf73的指令相对应,即紧跟系统调用后的指令。

如果是这种情况,有几种可能的解释:

  1. 您正在查看错误的主题,而不是实际崩溃的主题 (gdb) info thread显示什么?

  2. 您的内核对系统中发生的事情不满意,并且正在左右终止进程。查看/var/log/messages了解线索。

  3. 另一方面,如果您0xb788f50e处的说明符合0x000ddf6c处的说明(即call本身),那么您可能已设置了ulimit -s太低了?

    最后,如果您启用了SELinux,它可能会因为您违反其政策而终止您。检查appopriate selinux.log。