GDB 메뉴얼 등을 읽어보긴 했지만, 잘 모르겠습니다.
fork() 로 자식 프로세스를 만든 프로그램을 gdb 로 디버깅하는 방법이 너무 궁금하네요. :oops:
작년에 삽질 했던 부분이라서 약간의 도움이 될까 남겨봅니다.
a.out 이 fork 를 해서 수행이 된다고 했을때...
$ ps aux ... 1234 ... a.out 1236 ... a.out $
였을때, 원래 프로세스가 1234 이고 fork 가 된 프로세스가 1236 이면...
$ gdb a.out 1236
인지
$ gdb 1236 a.out
인지를 하면, 수행중인 프로세스에서 debugging 이 됩니다.
as simple as possible Jae-wan Janghttp://camars.kaist.ac.kr/~jwjang
작년에 삽질 했던 부분이라서 약간의 도움이 될까 남겨봅니다. a.out 이 fork 를 해서 수행이 된다고 했을때... $ ps aux ... 1234 ... a.out 1236 ... a.out $ 였을때, 원래 프로세스가 1234 이고 fork 가 된 프로세스가 1236 이면... $ gdb a.out 1236 인지 $ gdb 1236 a.out 인지를 하면, 수행중인 프로세스에서 debugging 이 됩니다.
gdb a.out 1236 이 맞습니다.
Consider the ravens: for they neither sow nor reap; which neither have storehouse nor barn; and God feedeth them: how much more are ye better than the fowls? Luke 12:24
현재 부모프로세스를 디버깅하고 있는 gdb) 外 에, 새로운 터미널창에서 새로운 gdb) 를 띄워서 작업하는 겁니까?
아니면, 부모프로세스를 디버깅하고 있는 그 gdb) 실행창에
:attach PID
를 써넣는 겁니까???
밑에 있는 방법으로 하니까, '퍼미션' 에러가 나고,
위에 있는 방법으로 하니까, 자식-프로세스로 시점(視占) 이 바뀌지가 않네요.
아아... 어렵네요.. 8-P
예전일이라, 잘 기억은 안나지만...
네, 전 새로운 터미널에서 작업을 했던걸로 기억합니다.
아니면, 부모프로세스를 디버깅하고 있는 그 gdb) 실행창에 :attach PID 를 써넣는 겁니까??? 밑에 있는 방법으로 하니까, '퍼미션' 에러가 나고, 위에 있는 방법으로 하니까, 자식-프로세스로 시점(視占) 이 바뀌지가 않네요. 아아... 어렵네요.. 8-P
Ctrl+C 로 자식 프로세스를 gdb 수행중에 중지시킨다음에 디버깅하기도 했었고요. 아니면, breakpoint 를 부모 프로세스에서 자식 프로세스의 코드에 걸어놓고 디버깅했는거 같기도 한데... 기억이 잘 ㅡㅡ;;
다른 고수님들이 대답해 주실것 같네요.
보통 멀티 프로세스 디버깅 (부모가 자식을 fork() 하는데 자식 프로세스를 디버깅하고 싶은 경우를 가정) 시에는 다음과 같은 꽁수를 쓰기도 합니다. 말이 좀 이상하네요 -_- 사실 이래 써도 불편하긴 매한가지지만.. 말 그대로 꼭 필요한 경우의 꽁수입니다.
DEBUG 등과 같은 전처리기 지시자를 사용하여.. DEBUG가 정의된 경우에는 자식 프로세스가 시작하자 마자 적정한 시간 (예를 들어.. 10초라고 합시다..) 동안 잠들게 하는 것입니다.
그리고, 앞서 다른 분들이 설명해 주신 것처럼..
gdb a.out 1236
과 같은 식으로 10초 내에 재빨리(-_-) gdb에 프로세스를 attach 하는 것이죠..
텍스트 포맷에 대한 자세한 정보
<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]
날아가는 process 잡기...
작년에 삽질 했던 부분이라서 약간의 도움이 될까 남겨봅니다.
a.out 이 fork 를 해서 수행이 된다고 했을때...
$ ps aux
...
1234 ... a.out
1236 ... a.out
$
였을때, 원래 프로세스가 1234 이고 fork 가 된 프로세스가 1236 이면...
$ gdb a.out 1236
인지
$ gdb 1236 a.out
인지를 하면, 수행중인 프로세스에서 debugging 이 됩니다.
as simple as possible
Jae-wan Jang
http://camars.kaist.ac.kr/~jwjang
Re: 날아가는 process 잡기...
gdb a.out 1236 이 맞습니다.
Consider the ravens: for they neither sow nor reap; which neither have storehouse nor barn; and God feedeth them: how much more are ye better than the fowls?
Luke 12:24
하나만 더요...
현재 부모프로세스를 디버깅하고 있는
gdb) 外 에, 새로운 터미널창에서
새로운 gdb) 를 띄워서 작업하는 겁니까?
아니면, 부모프로세스를 디버깅하고 있는
그 gdb) 실행창에
:attach PID
를 써넣는 겁니까???
밑에 있는 방법으로 하니까,
'퍼미션' 에러가 나고,
위에 있는 방법으로 하니까,
자식-프로세스로 시점(視占) 이 바뀌지가 않네요.
아아... 어렵네요.. 8-P
Re: 하나만 더요...
예전일이라, 잘 기억은 안나지만...
네, 전 새로운 터미널에서 작업을 했던걸로 기억합니다.
Ctrl+C 로 자식 프로세스를 gdb 수행중에 중지시킨다음에 디버깅하기도 했었고요.
아니면, breakpoint 를 부모 프로세스에서 자식 프로세스의 코드에 걸어놓고 디버깅했는거 같기도 한데... 기억이 잘 ㅡㅡ;;
다른 고수님들이 대답해 주실것 같네요.
as simple as possible
Jae-wan Jang
http://camars.kaist.ac.kr/~jwjang
멀티프로세스 디버깅.. 꽁수
보통 멀티 프로세스 디버깅 (부모가 자식을 fork() 하는데 자식 프로세스를 디버깅하고 싶은 경우를 가정)
시에는 다음과 같은 꽁수를 쓰기도 합니다. 말이 좀 이상하네요 -_-
사실 이래 써도 불편하긴 매한가지지만.. 말 그대로 꼭 필요한 경우의 꽁수입니다.
DEBUG 등과 같은 전처리기 지시자를 사용하여.. DEBUG가 정의된 경우에는
자식 프로세스가 시작하자 마자 적정한 시간 (예를 들어.. 10초라고 합시다..) 동안 잠들게 하는 것입니다.
그리고, 앞서 다른 분들이 설명해 주신 것처럼..
gdb a.out 1236
과 같은 식으로 10초 내에 재빨리(-_-) gdb에 프로세스를 attach 하는 것이죠..
댓글 달기