두 개의 프로그램이 blah과 ret으로되어 있다고합시다. 난 멍청한ret 프로그램에서 입/출력 리디렉션을 통해 입력을 수신하는 프로그램을 디버그하고 싶습니다. 다음 경우에 blah 프로그램을 gdb를 사용하여 디버깅하려면 어떻게해야합니까?gdb - 파이프로 디버깅
bash> ret | blah
두 개의 프로그램이 blah과 ret으로되어 있다고합시다. 난 멍청한ret 프로그램에서 입/출력 리디렉션을 통해 입력을 수신하는 프로그램을 디버그하고 싶습니다. 다음 경우에 blah 프로그램을 gdb를 사용하여 디버깅하려면 어떻게해야합니까?gdb - 파이프로 디버깅
bash> ret | blah
처음에는 프로그램을 실행하고 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
과 같이 시스템을 다시 시작할 때 자동으로 제거되는 디렉토리에 배치하십시오).
GDB의 run
명령은 bash
을 사용하여 리디렉션을 수행합니다. ret | blah
에 해당하는 간단한 방법은 bash의 process substitution 기능을 사용하는 것입니다.
$ gdb blah
...
(gdb) run < <(ret)
설명 : 배쉬 ret
의 표준 출력의 파일 기술자이다 /dev/fd/123
같은과 <(ret)
대체합니다. 우리는 수동으로 직접 생성 할 필요가 없다는 점과 ret
프로세스의 수명에 대해 걱정할 필요가 없다는 점을 제외하고는 다른 응답에서 설명한 것처럼 이름이 지정된 FIFO와 마찬가지로 fd를 사용할 수 있습니다.
다음과 다른가요? http://stackoverflow.com/questions/4521015/how-to-pass-arguments-and-redirect-stdin-from-a-file-to-program-run-in-gdb –