기본 콘텐츠로 건너뛰기

signal 처리 중에 signal이 발생하면?

이것저것 더 테스트 해봐야하지만, signal 처리 시 signal 이 발생하면 무슨 일이 생길까?

sf.cpp 원문
#include <signal.h>
#include <iostream>
using namespace std;

void
sigFunc(int sig)
{
        cerr << "SIGNUM: " << sig << endl;
        cerr << "I'll make segmentation fault" << endl;
/*
        char* p(NULL);
        *p = 20;
*/
        abort();
}

int
main(int,char**)
{
        signal(SIGSEGV, sigFunc);
        char* p(NULL);
        *p = 20;
        return 0;
}

컴파일
$ g++ -g -o sf sf.cpp


실행
./sf
SIGNUM: 11
I'll make segmentation fault
Aborted (core dumped)


디버깅

$gdb -c core.24262 ./sf
GNU gdb Red Hat Linux (6.3.0.0-1.63rh)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...Using host libthread_db library "/lib/tls/libthread_db.so.1".

Core was generated by `./sf'.
Program terminated with signal 6, Aborted.
Reading symbols from /usr/lib/libstdc++.so.6...done.
Loaded symbols for /usr/lib/libstdc++.so.6
Reading symbols from /lib/tls/libm.so.6...done.
Loaded symbols for /lib/tls/libm.so.6
Reading symbols from /lib/libgcc_s.so.1...done.
Loaded symbols for /lib/libgcc_s.so.1
Reading symbols from /lib/tls/libc.so.6...done.
Loaded symbols for /lib/tls/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
#0  0x0043b7a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
(gdb) bt
#0  0x0043b7a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
#1  0x0047b7d5 in raise () from /lib/tls/libc.so.6
#2  0x0047d149 in abort () from /lib/tls/libc.so.6
#3  0x080488ce in sigFunc (sig=11) at sf.cpp:14
#4  <signal handler called>
#5  0x08048906 in main () at sf.cpp:22
(gdb)
만약 주석부분을 풀었다면?
$ gdb -c core.24395 ./sf
GNU gdb Red Hat Linux (6.3.0.0-1.63rh)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...Using host libthread_db library "/lib/tls/libthread_db.so.1".

Core was generated by `./sf'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /usr/lib/libstdc++.so.6...done.
Loaded symbols for /usr/lib/libstdc++.so.6
Reading symbols from /lib/tls/libm.so.6...done.
Loaded symbols for /lib/tls/libm.so.6
Reading symbols from /lib/libgcc_s.so.1...done.
Loaded symbols for /lib/libgcc_s.so.1
Reading symbols from /lib/tls/libc.so.6...done.
Loaded symbols for /lib/tls/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
#0  0x080488d3 in sigFunc (sig=11) at sf.cpp:12
12              *p = 20;
(gdb) bt
#0  0x080488d3 in sigFunc (sig=11) at sf.cpp:12
#1  <signal handler called>
#2  0x08048914 in main () at sf.cpp:22
(gdb)

아무래도 그래야겠지?

댓글

이 블로그의 인기 게시물

탐색기에서 OneDrive 이 2개로 보이는 문제

왜 2개가 보이는지 모르겠지만, Registry 삭제하면 됨 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace 하위 키에서 OneDrive 둘 중에 하나만 지워도 바로 반영됨. 참조:  https://answers.microsoft.com/en-us/msoffice/forum/all/duplicate-onedrives-in-file-explorer/49c935a6-287b-43a5-aed5-2dee2a1c1b22

절전을 깨운 녀석 알아내기

가끔씩 윈도우 절전을 깨우는 녀석이 있는데, 보통은 USB Keyboard/Mouse 이다. 요런 녀석들은 장치관리자에서 "이 장치를 사용하여 컴퓨터의 대기 모드를 종료할 수 있음"을 꺼주면 된다. 그래도 가끔씩 알 수 없는 이유로 켜졌을 경우, 관리자 권한으로 커맨드 창 열고 확인한다. C:\> powercfg -lastwake 절전 모드 해제 기록 카운트 - 1 절전 모드 해제 기록[0] 절전 모드 해제 소스 카운트 - 1 절전 모드 해제 소스[0] 종류: 장치 인스턴스 경로: XXX 이름: YYY 설명: ZZZ 제조업체: AAA