GDB디버깅.. 뭐가 문제인지. 모르겠네요.

qufdl113의 이미지

안녕하세요.
윈도에서만 작업하다가,
리눅스상에서 서버를 만들려니 디버깅이 너무 어렵네요.
Makefile을 만들고,
make를해서 실행파일 만든후 실행파일만 실행하면 작동이 잘 되는데,
디버깅을 하기 위해서 gdb로 들어가서 디버깅 하다보면, fork가 안되고 죽어 버립니다.
:arrow: 죽는부분의 코드는 아래에.

// 서버 초기화
bool Init_Server()
{
	// 데몬화 작업
    	pid_t pid;
	
	// parent terminates
	if((pid = fork()) != 0 )	
	{
		printf("pid = %ld \n", pid);
		exit(0);
	}
	
	// first child continues
		
	setsid();
		
	signal(SIGHUP, SIG_IGN);
	
	// first child terminates


	if( (pid = fork()) != 0 ) 	
	{
	    printf("pid = %ld \n", pid); //***pid=12로 여기서 죽어버려요.***
		exit(0);
	}
:
:
}

디버깅 할때는 아래처럼 치고 들어가서.
$ gdb mainserver
브레이크포인트 잡고, run한다음에 n열쉬미 누르면서 했습니다.

왜 그런지 내공이 모자란 관계로 도저히 모르겠네요.

File attachments: 
첨부파일 크기
HTML icon GDB를 이용한 디버깅.htm392.47 KB
greatlee의 이미지

gdb가 원래 자식프로세스 디버깅하는게 어렵습니다.

fork 하게되면, 자식프로세스가 안만들어지는 경우가 많습니다. 버그라고 해야하나..

자식에 대한 디버깅은 기대하기 힘들겠지요..

제가 써본 여러 꽁수는 다음과 같습니다.. 이글 보고 뒤집어지는분 계실라나 모르겠네요.

부모가 호출하는 함수와 자식이 호출하는 함수를 바꿔서 실행한 다음에.. 부모프로세스에서 디버깅을 계속해본 적이 있구요..

자식프로세스에서 수행하는 작업을 별도 실행파일로 만들어서.. 서버 띄워놓고, 별도파일에 대한 디버깅을 한적이 있습니다. 나중에는 이방법을 많이 썼던것 같네요.

책에서는.. 실행중인 프로세스를 gdb로 잡아서 디버깅하는 방법도 있다고 보았습니다. 이방법이 사실이라면.. 자식프로세스에 sleep을 걸어두고, 디버거로 잡아서 디버깅할 수 도 있겠네요. 저도 해본적은 있지만.. 결과가 안좋았던것 같습니다. 이후에 시도하지 않았으니까요.

fatman의 이미지

혹시 현재 수행중에 있는 process를 곧바로 debug할 수 있는 기능을 사용하시지는 않으셨는지요? GDB의 gui version격인 DDD에는 현재 수행되는 processs에 곧바로 접근하여 debug을 할 수 있는 메뉴를 제공해주는 것으로 알고 있는데, 지금은 제가 정확하게 확인할 수는 없네요. DDD가 지원한다면 gdb도 그런 기능을 제공하지 않을까 싶습니다.

...

eminency의 이미지

보통 gdb 쓸 때 인자 하나만 주면 실행파일이고 두번째 인자는 코어파일인데 대신 pid를 쓰면 프로세스에 대한 디버깅이 가능합니다.

다음은 gdb의 man 페이지를 인용한 것입니다.

Quote:

You can also start with both an executable program and a core file specified:

gdb program core

You can, instead, specify a process ID as a second argument, if you want to debug a running process:

gdb program 1234

would attach GDB to process 1234 (unless you also have a file named `1234'; GDB does check for a core file first).

노루가 사냥꾼의 손에서 벗어나는 것 같이, 새가 그물치는 자의 손에서 벗어나는 것 같이 스스로 구원하라 -잠언 6:5

tombraid의 이미지

부모프로세스와의 코웍이 없다면 다음과 같은 방법도 괜찮습니다.

gdb>break fork

gdb>run
 
....
#fork 에서 브레이크가 걸리면
gdb> return 0

#이하 자식 프로세스
qufdl113의 이미지

답변감사합니다.

haewoo의 이미지

제가 참조하는 문서입니다.

KLDP에서 구해서 저장해 놓은 문서이니까 참조하시면 gdb 사용에 도움이 되실겁니다.

댓글 첨부 파일: 
첨부파일 크기
HTML icon 0바이트

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.