sigaction에 대해서...

vananamilk의 이미지

안녕하세요.

struct sigaction act;
act.sa_handler = myexit;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
 
sigaction(SIGSEGV, &act, 0);

위와 같이 SIGSEGV 신호를 myexit()와 연결하였는데요.
저렇게 하니 덤프 파일이 생성되지는 않더군요.

myexit()에서 마지막에 원래 SIGSEGV때 동작하는 시스템함수를
호출하는 방법은 없나요?

dalili의 이미지

현재 코드는 SIGSEGV를 myexit 함수에서 처리하도록 되어 있잖아요

그러면 core 파일도 생기지 않겠고요

지금 하시고 싶은것은 core파일을 만들고 싶다는 말씀이시죠?

myexit 함수에서 core파일을 직접 만들고 종료 시키게 한다거나 (방법은 모름 ㅎㅎ)

아니면 myexit 함수내에서 다시한번 SIGSEGV 시그널을 발생시켜서 죽이면 되겠군요.

1. sigaction(SIGSEGV, &act, 이전시그널셋정보);

SIGSEGV 시그널이 발생하면
2. myexit 함수에서 이전시그널셋정보로 되돌린다
3. myexit 함수에서 다시한번 SIGSEGV 시그널을 발생시킨다

잘 생각은 안나는데 이런식으로 했던것 같습니다

vananamilk의 이미지

그렇다면 SIGSEGV를 다시 제가 임의로 발생시키는 거잖아요~
그렇게 해서 core 파일이 만들어지면 최초 SIGSEGV 발생시 문제
됐던 부분이 나오는건가요?

ymir의 이미지

#include <stdio.h>
#include <execinfo.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
 
void handler(int sig)
{
	void *array[10];
	size_t size;	// get void*'s for all entries on the stack
 
	size = backtrace(array, 10);	// print out all the frames to stderr
	fprintf(stderr, "Error: signal %d:\n", sig);
	backtrace_symbols_fd(array, size, 2);
 
	signal(SIGSEGV, SIG_DFL);
	raise(SIGSEGV);
}
 
void baz(void)
{
	int *foo = (int *)-1; // make a bad pointer
	printf("%d\n", *foo); // causes segfault
}
 
void bar(void)
{
	baz();
}
 
void foo(void)
{
	bar();
}
 
int main(void)
{
	signal(SIGSEGV, handler);
	foo();
	return 0;
}

$ 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 』

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.