2009-09-21 2 views
35

두 개의 프로그램이 blahret으로되어 있다고합시다. 난 멍청한ret 프로그램에서 입/출력 리디렉션을 통해 입력을 수신하는 프로그램을 디버그하고 싶습니다. 다음 경우에 blah 프로그램을 gdb를 사용하여 디버깅하려면 어떻게해야합니까?gdb - 파이프로 디버깅

bash> ret | blah 
+0

다음과 다른가요? http://stackoverflow.com/questions/4521015/how-to-pass-arguments-and-redirect-stdin-from-a-file-to-program-run-in-gdb –

답변

41

처음에는 프로그램을 실행하고 pid로 디버깅 할 수 있습니다. 물론이 솔루션은 모든 경우를 다루지는 않습니다.

또 다른 접근법은 프로세스 간 통신에 Linux 기능을 사용하는 것입니다. 즉, ret의 출력을 FIFO 특수 파일 ("named pipe")로 리디렉션 한 다음 디버거를 통해 해당 FIFO에서 읽습니다. 그것이 어떻게 완료되었는지 알려드립니다. 배쉬에서 실행

mkfifo foo 

이것은 명명 된 파이프 될 것 디렉토리에있는 특별한 파일을 만듭니다. 이 파일에 (동일한 구문 echo "Hello" >foo을 사용하여) 텍스트를 쓰면 누군가가 파일에서 데이터를 읽을 때까지 쓰기 프로그램이 차단됩니다 (예 : cat <foo). 여기서는 gdb 제어 프로세스가이 파일에서 읽습니다. 당신이 떠들썩한 파티에서 운영하는 FIFO를 생성 한 후

:

ret > foo & # ampersand because it may block as nobody is reading from foo 
gdb blah 

그런 다음, GDB 프롬프트에서,

run <foo 

를 실행하고 원하는 효과를 얻을. FIFO에서 데이터를 두 번 읽을 수는 없다는 점에 유의하십시오. 모든 데이터를 읽었을 때 blah 프로세스가 종료되고 foo에 대한 명령을 반복해야합니다. 다른 쉘 창에서).

rm foo으로 fifo를 제거하십시오 (또는 /tmp과 같이 시스템을 다시 시작할 때 자동으로 제거되는 디렉토리에 배치하십시오).

+1

디스크 공간을 감당할 수 있다면 FIFO'foo' 대신에'foo' 일반 파일에 파이프 할 수도 있습니다 (하나의 명령을 저장합니다 :). – Frank

+7

일반 파일과 FIFO/파이프는 read()에 대해 다른 의미를가집니다. 일반 파일에서 EOF에 도달하면 read()는 지정된 바이트 수보다 적은 바이트로 읽습니다. FIFO/파이프에서 읽는 경우 지정된 바이트 수에 도달 할 때까지 read() 블록을 실행하거나 파이프에 쓰는 프로세스가 종료됩니다. – SzG

9

GDB의 run 명령은 bash을 사용하여 리디렉션을 수행합니다. ret | blah에 해당하는 간단한 방법은 bash의 process substitution 기능을 사용하는 것입니다.

$ gdb blah 
... 
(gdb) run < <(ret) 

설명 : 배쉬 ret의 표준 출력의 파일 기술자이다 /dev/fd/123 같은과 <(ret) 대체합니다. 우리는 수동으로 직접 생성 할 필요가 없다는 점과 ret 프로세스의 수명에 대해 걱정할 필요가 없다는 점을 제외하고는 다른 응답에서 설명한 것처럼 이름이 지정된 FIFO와 마찬가지로 fd를 사용할 수 있습니다.

+0

정확하게 내 요구에 맞는, 감사합니다. – Limeth

+0

이것은 zsh에서는 작동하지 않습니다. 대안이 있습니까? – redfast00

+0

프로세스 대체는 bash에서와 같이 zsh에서 동일하게 작동합니다. 호출은 무엇이고 어떤 오류 메시지가 발생합니까? –

관련 문제