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
'programing' 카테고리의 다른 글
| 'ObjectId' 개체에 'getTimeStamp' 특성이 없습니다. (0) | 2023.06.23 |
|---|---|
| 각 값은 한 열에 몇 번 표시됩니까? (0) | 2023.06.23 |
| Oracle 19의 최대 절전 모드 방언 (0) | 2023.06.23 |
| 소스 트리를 밀어넣으려고 할 때 "태그가 이미 존재하기 때문에 업데이트가 거부되었습니다." (0) | 2023.06.23 |
| VBA를 사용하여 Excel 사용자 양식의 다중 열 목록 상자에 헤더를 추가하는 방법 (0) | 2023.06.23 |