stdin을 읽고 gdb에서 매개 변수를 사용하는 프로그램을로드하는 방법은 무엇입니까?


101

stdin에서 입력을 받고 명령 줄에서 일부 매개 변수를 취하는 프로그램이 있습니다. 다음과 같이 보입니다.

cat input.txt > myprogram -path "/home/user/work"

emacs 내부에서 gdb로 코드를 디버그하려고합니다. Mx gdb에서 다음 명령으로 프로그램을로드하려고합니다.

gdb cat input.txt > myprogram -path "/home/user/work"

그러나 gdb는 그것을 좋아하지 않습니다.

여기 에서 질문이 작성 되었습니다 . 불행히도 솔루션을 이해하지 못하고 -g옵션으로 컴파일하고 Mx gdb 명령을 실행하는 것 이상으로 무엇을 해야할지 모르겠습니다 .

답변:


132

셸에서 수행하는 경우 다음과 같이 할 수 있습니다.

% gdb myprogram
gdb> run params ... < input.txt

이것은 emacs에서도 작동하는 것 같습니다.


리디렉션이 작동하는 것 같지만 오류가 발생합니다. 메모리에서 유효한 개체 파일 이미지를 읽지 못했습니다. 프로그램이 코드 042로 종료되었습니다. 아이디어가 있습니까?
vinc456

이는 일반적인 GDB 오류 일 가능성이 높으며 emacs 내에서 실행중인 사실과는 아무 관련이 없습니다. 먼저 쉘에서 GDB를 실행하는 방법을 배우고 (필요한 경우 새로운 질문으로) emacs 내에서 실행하는 것에 대해 걱정하십시오.
Alnitak

1
나는 그것을 알아. 어떤 이유로 나는 "int main ..."대신 void main (int argc, char * argv [])을 입력했고 그것은 내 눈을 떴다. 어쨌든 모든 것이 이제 잘 작동합니다. 당신의 도움을 주셔서 감사합니다!
vinc456

2
뒤늦은 감사합니다-gdb 매뉴얼은 준설을하는 데있어 고통 스럽습니다.
삭제됨 '

1
Windows가 msys64를 사용에 나는 얻을 <input.txt같이 argv내 프로그램에 인수 :( 내 GDB 8.2.1 이러한 답변을 주위에 파고하겠습니다 : stackoverflow.com/questions/3544325/...
ixe013

32

이를 수행하는 방법에는 여러 가지가 있습니다.

$ gdb myprogram
(gdb) r -path /home/user/work < input.txt

또는

$ gdb myprogram
(gdb) set args -path /home/user/work < input.txt
(gdb) r

또는

$ gdb -ex 'set args -path /home/user/work < input.txt' myprogram
(gdb) r

여기서 gdb run명령 ( r)은 기본적으로 이전에에서 설정 한 인수를 사용 set args합니다.


4
cygwin에서 gdb로 이것을 시도하면 작동하지 않습니다. "show args"명령은 내가 원하는 args를 입력했음을 보여 주지만 "r"로 프로그램을 시작하면 프로그램은 지정된 파일에서 읽는 대신 내용을 입력 할 때까지 기다립니다.
카디프 공간 남자

1
@cardiffspaceman, 글쎄, 난 Cygwin에서 그것을 테스트 할 수 없습니다 - 아마도 자신의 GDB 버전은 어떻게 든 제한된다
maxschlepzig

왜 단순히 gdb -ex 'r -path /home/user/work < input.txt' myprogram세 번째 변종이 아닌가?
Ruslan

@Ruslan뿐만 아니라 작동 - 사용 '설정 인수를 ...'대화 형 프로그램을 실행하기 전에 일부 중단 점 등을 정의하는 당신에게 기회를 제공합니다
maxschlepzig

맞지만, 비대화 형으로 중단 점을 설정할 수도 있습니다 (예 : gdb -ex 'b main' -ex 'r -path /home/user/work < input.txt' myprogram.
Ruslan

6

완전성을 위해 디버깅 세션을 시작할 때 --args 옵션도 있습니다. 즉)

gdb gdbarg1 gdbarg2 --args yourprog arg1 arg2 -x arg3

14
이와 같은 디버깅 세션을 시작할 때 input.txt를 어떻게 yourprog에 대한 입력으로 리디렉션합니까?
Peter Ajtai

1
@Peter :gdb --args yourprog.out input.txt
Ben Elgar 2013

1
이는 "yourprog"가 입력 리디렉션이 아닌 입력을 지정하는 파일 이름을 예상하는 경우에만 작동합니다.
Alnitak

0

처음부터 디버그 할 필요가없는 경우 다음을 사용하여 이미 실행중인 프로세스에 연결할 수도 있습니다.

$ gdb myprogram xxx

여기서 xxx는 프로세스 ID입니다. 그러면 gdb에 시작 인수를 알릴 필요가 없습니다.


4
"reading stdin"부분에서 질문 제목에 대한 답을 놓쳤습니다. 더 짧으면 어딘가에 좋은 코멘트를 할 것입니다.
Notinlist 2011
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.