programing

gdb - 파이프를 사용한 디버깅

subpage 2023. 6. 23. 22:09
반응형

gdb - 파이프를 사용한 디버깅

제가 blah와 ret라는 이름의 두 프로그램을 가지고 있다고 칩시다.I/O 리다이렉션을 통해 ret 프로그램에서 입력을 받는 blah 프로그램을 디버그하고 싶습니다.다음의 경우 gdb를 사용하여 blah 프로그램을 디버그하려면 어떻게 해야 합니까?

bash> ret | blah 

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

또 다른 접근 방식은 프로세스 간 통신에 Linux 기능을 사용하는 것입니다.간단히 말해서, 다음의 출력을 리디렉션합니다.retFIFO 특수 파일("이름이 붙은 파이프")로 이동한 다음 디버거를 통해 FIFO에서 읽습니다.방법은 이렇습니다.bash에서 실행:

mkfifo foo

그러면 디렉터리에 명명된 파이프 역할을 하는 특수 파일이 만들어집니다.이 파일에 텍스트를 쓸 때(동일한 구문 사용)echo "Hello" >foo), 쓰기 프로그램은 누군가가 파일의 데이터를 읽을 때까지 차단됩니다(cat <foo예를 들어).이 경우 gdb 제어 프로세스가 이 파일에서 읽힙니다.

fifo를 생성한 후 bash에서 실행:

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

그런 다음 gdb 프롬프트에서 실행합니다.

run <foo

그리고 원하는 효과를 얻을 수 있습니다.fifo(일반 파이프뿐만 아니라)에서 데이터를 두 번 읽을 수 없습니다. 모든 데이터를 읽었을 때,blah프로세스가 중지되고 foo에 쓰기 명령을 반복해야 합니다(다른 셸 창에서 수행할 수 있음).

작업이 끝나면 다음과 같이 피포를 제거합니다.rm foo(또는 다음과 같이 시스템 재시작 시 자동으로 제거될 디렉토리에 배치합니다.)/tmp).

GDB의run명령 사용bash리디렉션을 수행합니다.다음과 같은 이점을 얻을 수 있는 간단한 방법ret | blahbash의 프로세스 대체 기능을 사용하는 것입니다.

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

설명: bash 대체물<(ret)와 같은 것으로/dev/fd/123다음 중 stdout의 파일 설명자입니다.ret다른 답변에 설명된 것처럼 FD를 명명된 FIFO와 유사하게 사용할 수 있습니다. 단, 수동으로 FD를 생성하거나 FD의 수명에 대해 걱정할 필요가 없습니다.ret과정.

언급URL : https://stackoverflow.com/questions/1456253/gdb-debugging-with-pipe

반응형