GDB디버깅.. 뭐가 문제인지. 모르겠네요.
글쓴이: qufdl113 / 작성시간: 목, 2004/04/01 - 6:12오후
안녕하세요.
윈도에서만 작업하다가,
리눅스상에서 서버를 만들려니 디버깅이 너무 어렵네요.
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:
첨부 | 파일 크기 |
---|---|
GDB를 이용한 디버깅.htm | 392.47 KB |
Forums:
gdb가 원래 자식프로세스 디버깅하는게 어렵습니다.fork 하게되
gdb가 원래 자식프로세스 디버깅하는게 어렵습니다.
fork 하게되면, 자식프로세스가 안만들어지는 경우가 많습니다. 버그라고 해야하나..
자식에 대한 디버깅은 기대하기 힘들겠지요..
제가 써본 여러 꽁수는 다음과 같습니다.. 이글 보고 뒤집어지는분 계실라나 모르겠네요.
부모가 호출하는 함수와 자식이 호출하는 함수를 바꿔서 실행한 다음에.. 부모프로세스에서 디버깅을 계속해본 적이 있구요..
자식프로세스에서 수행하는 작업을 별도 실행파일로 만들어서.. 서버 띄워놓고, 별도파일에 대한 디버깅을 한적이 있습니다. 나중에는 이방법을 많이 썼던것 같네요.
책에서는.. 실행중인 프로세스를 gdb로 잡아서 디버깅하는 방법도 있다고 보았습니다. 이방법이 사실이라면.. 자식프로세스에 sleep을 걸어두고, 디버거로 잡아서 디버깅할 수 도 있겠네요. 저도 해본적은 있지만.. 결과가 안좋았던것 같습니다. 이후에 시도하지 않았으니까요.
혹시 현재 수행중에 있는 process를 곧바로 debug할 수 있는 기
혹시 현재 수행중에 있는 process를 곧바로 debug할 수 있는 기능을 사용하시지는 않으셨는지요? GDB의 gui version격인 DDD에는 현재 수행되는 processs에 곧바로 접근하여 debug을 할 수 있는 메뉴를 제공해주는 것으로 알고 있는데, 지금은 제가 정확하게 확인할 수는 없네요. DDD가 지원한다면 gdb도 그런 기능을 제공하지 않을까 싶습니다.
...
보통 gdb 쓸 때 인자 하나만 주면 실행파일이고 두번째 인자는 코어파일
보통 gdb 쓸 때 인자 하나만 주면 실행파일이고 두번째 인자는 코어파일인데 대신 pid를 쓰면 프로세스에 대한 디버깅이 가능합니다.
다음은 gdb의 man 페이지를 인용한 것입니다.
노루가 사냥꾼의 손에서 벗어나는 것 같이, 새가 그물치는 자의 손에서 벗어나는 것 같이 스스로 구원하라 -잠언 6:5
재미있는 방법이 있습니다.
부모프로세스와의 코웍이 없다면 다음과 같은 방법도 괜찮습니다.
GDB는 리눅스에서 멀티 프로세스 디버깅이 안되는군요 ㅡㅡ;
답변감사합니다.
☆
GDB에서도 자식 Process를 Debugging할 수 있습니다.
제가 참조하는 문서입니다.
KLDP에서 구해서 저장해 놓은 문서이니까 참조하시면 gdb 사용에 도움이 되실겁니다.
댓글 달기