기본 콘텐츠로 건너뛰기

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)

아무래도 그래야겠지?

댓글

이 블로그의 인기 게시물

Winget 해시 무시하기

가끔씩 Winget 에서 패키지를 다운로드 했을 때, "설치 관리자 해시가 일치하지 않습니다." 오류가 뜰 때가 있다. 보안 이슈가 있지만, 그냥 무시하고 싶을 때, 아래 순서로 무시해준다. 관리자 권한 winget settings --enable InstallerHashOverride 설치 winget install --ignore-security-hash --id NirSoft.NirCmd

설치한 패키지에서 RPM 추출하기

오래된 패키지를 관리할 저장소가 없어졌고, 기존 패키지로 다른 서버를 세팅해야할 일이 생겼다면 RPM의 리패키지 기능을 이용해보자. $ rpm -e --repackage [PACKAGE_NAME] 위와 같이 리패키지하면, /var/spool/repackage/ 에 생성한 RPM파일이 있다. :-)