2013-05-23 4 views
1

다음은 최근 충돌에서 얻은 백 트레이스입니다. fopen 호출을 가리 킵니다. 여기서 무슨 일이 일어나고 있는지 확실하지 않습니다. 장치에 충분한 공간이 있습니다. & 파일이 해당 파일이 아니더라도 NULL을 반환해야합니다.백 트레이스가 충돌을 일으키도록 가리 킵니다

크래시가 의미가 없습니다. 여기

(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 

당신의 도움을 주셔서 감사 BT는 것입니다.

추신 : 또 하나, 원격으로 매핑 된 파일 시스템. 그냥 그것에 대해 알게되었습니다. 그럴 수 있습니다.

+0

메모리 손상 가능성이 가장 큽니다 ('fopen'직전 또는 멀티 스레드 응용 프로그램 인 경우). 또는 프로그램에 가상 메모리가 부족할 수도 있습니다. – Inspired

+0

다른 프로세스가 동시에 오류가 발생하여 – vindyz

+0

p를 가리킬 수 있습니다. MY_FILE이 파일 위치를 가리키는 정적 매크로 –

답변

3

__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 0xb788f50e0x000ddf73 나의 명령에 해당 가능성이 높다. 실제로 추락

  1. 당신은 잘못된 스레드에서 찾고, 안 ​​하나 : 그런 경우에는

    은 몇 가지 가능성이 설명이 있습니다.
    (gdb) info thread는 무엇을 표시합니까?

  2. 커널이 시스템에서 발생하는 일에 만족하지 않고 왼쪽 및 오른쪽 프로세스를 종료합니다. 단서는 /var/log/messages을 확인하십시오.

    한편

0xb788f50e에서 당신의 명령은 아마도 당신이 당신의 ulimit -s이 너무 낮게 설정 한, 0x000ddf6c (즉 call 자체)에서 내 명령에 해당하는 경우?

마지막으로 SELinux를 활성화 한 경우 정책 위반으로 종료 될 수 있습니다. 알맞은 selinux.log를 확인하십시오.

관련 문제