sigaction에 대해서...
글쓴이: vananamilk / 작성시간: 수, 2009/11/11 - 9:22오후
안녕하세요.
struct sigaction act; act.sa_handler = myexit; sigemptyset(&act.sa_mask); act.sa_flags = 0; sigaction(SIGSEGV, &act, 0);
위와 같이 SIGSEGV 신호를 myexit()와 연결하였는데요.
저렇게 하니 덤프 파일이 생성되지는 않더군요.
myexit()에서 마지막에 원래 SIGSEGV때 동작하는 시스템함수를
호출하는 방법은 없나요?
Forums:
있습니다
현재 코드는 SIGSEGV를 myexit 함수에서 처리하도록 되어 있잖아요
그러면 core 파일도 생기지 않겠고요
지금 하시고 싶은것은 core파일을 만들고 싶다는 말씀이시죠?
myexit 함수에서 core파일을 직접 만들고 종료 시키게 한다거나 (방법은 모름 ㅎㅎ)
아니면 myexit 함수내에서 다시한번 SIGSEGV 시그널을 발생시켜서 죽이면 되겠군요.
1. sigaction(SIGSEGV, &act, 이전시그널셋정보);
SIGSEGV 시그널이 발생하면
2. myexit 함수에서 이전시그널셋정보로 되돌린다
3. myexit 함수에서 다시한번 SIGSEGV 시그널을 발생시킨다
잘 생각은 안나는데 이런식으로 했던것 같습니다
네... 그런 방법이 있군요~~~
그렇다면 SIGSEGV를 다시 제가 임의로 발생시키는 거잖아요~
그렇게 해서 core 파일이 만들어지면 최초 SIGSEGV 발생시 문제
됐던 부분이 나오는건가요?
음..
$ gcc -g -W -Wall -rdynamic bt.c
$ ./a.out
Error: signal 11:
./a.out(handler+0x19)[0x804878d]
[0xb7f6c420]
./a.out(bar+0xb)[0x8048817]
./a.out(foo+0xb)[0x8048824]
./a.out(main+0x29)[0x804884f]
/lib/libc.so.6(__libc_start_main+0xd8)[0xb7e62878]
./a.out[0x80486d1]
Segmentation fault (core dumped)
$ gdb a.out core
GNU gdb 6.8
...
Core was generated by `./a.out'.
Program terminated with signal 11, Segmentation fault.
[New process 11874]
#0 0x080487f8 in baz () at bt.c:24
24 printf("%d\n", *foo); // causes segfault
(gdb) bt
#0 0x080487f8 in baz () at bt.c:24
#1 0x08048817 in bar () at bt.c:29
#2 0x08048824 in foo () at bt.c:34
#3 0x0804884f in main () at bt.c:41
(gdb) quit
core 에서 handler 까지 나올거라 생각했었는데.. 그냥 원래(?)대로 찍히는군요..
reference)
http://stackoverflow.com/questions/77005/how-to-generate-a-stacktrace-when-my-gcc-c-app-crashes
http://www.alexonlinux.com/how-to-handle-sigsegv-but-also-generate-core-dump
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
댓글 달기