Bash 스크립트 내에서 GDB를 사용하여 명령 줄 인수가있는 프로그램을 어떻게 실행합니까?


428

GDB에서 프로그램을 실행할 때 일반적으로 프로그램의 인수는 run명령에 제공됩니다. GDB를 사용하여 프로그램을 실행하고 쉘 스크립트 내에서 인수를 제공하는 방법이 있습니까?

스크립트가 실행을 시작한 후 프로그램에 GDB를 첨부 할 수 있다고 언급하면서 관련 질문에 대한 답변을 보았습니다. 그러나 나는 프로그램을 '기다려야한다'.

다른 방법이 있습니까?


답변:


612

--args 매개 변수를 사용하여 gdb를 실행할 수 있습니다.

gdb --args executablename arg1 arg2 arg3

자동으로 실행하려면 일부 명령 (예 : 'run')을 파일에 넣고 -x / tmp / cmds 인수로 지정하십시오. 선택적으로 -batch 모드로 실행할 수 있습니다.

gdb -batch -x /tmp/cmds --args executablename arg1 arg2 arg3

53
Argg man gdb는 포함 --args하지 않기 때문에 찾지 못했습니다. gdb --help그렇습니다.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1
@CiroSantilli 新疆 改造 中心 法轮功 六四 事件 GDB는 GNU입니다. GNU 도구의 전체 설명서를 보려면 info gdb다음에 :-) 를 사용해야 합니다.
Apteryx

1
@Apteryx 어쩌면 언젠가 내가 배울 것이다 info. Google 또는 Stack Overflow가 XD 작동을 중지 한 경우
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1
@CiroSantilli 新疆 改造 中心 法轮功 六四 事件 'i'키 ( index-search)를 발견 한 후 정보에 매료되었습니다 . 시도하십시오 : info gdb, 'i', '--args'. 그것은 바로 당신을 가져올 것입니다.
Apteryx

138
gdb -ex=r --args myprogram arg1 arg2

-ex=r에 대한 짧은 -ex=run하고 프롬프트에서 "실행"을 입력하는 대신 대기보다, 즉시 프로그램을 실행 gdb를 알려줍니다. 그런 다음 --args뒤에 나오는 모든 것이 명령 줄 프롬프트에서 일반적으로 입력하는 것처럼 명령과 인수라고 말합니다.


-exe=r매우 유용한 것에 대해 몰랐습니다 !
Jeef

46

개인적으로 --args매개 변수 를 기억할 필요없이 약간 더 편리하고 직관적으로 찾을 수있는 또 다른 방법 은 정상적으로 컴파일하고 다음과 같이 r arg1 arg2 arg3안에서 직접 사용 하는 것입니다 gdb.

$ gcc -g *.c *.h
$ gdb ./a.out
(gdb) r arg1 arg2 arg3

23
이것이 바로 OP가 피하지 않기를 바라고있는 것입니다.
KarateSnowMachine 15시 52 분

6
흠, 고마워요. 나는 그것이 어떻게 오랫동안 나의 고지를 피했는지 잘 모르겠습니다. iirc, 나는 "gdb를 사용하여 명령 줄 인수를 전달하는 방법"과 같은 것을 Google 검색했을 때이 질문에 우연히 빠져서 누락 된 답변을 찾은 다음 추가했습니다. , (거의 1 년 동안) 내 대답이 당면한 문제를 해결하지 못했다는 것을 깨닫지 못했습니다.
aspiring_sarge

2
@KarateSnowMachine 누군가 Google에 도착했을 때이 답변은 내가 찾던 내용에 더 가깝 습니다. 아마도 우리는 질문이 일반적인 제목을 가지고 있기 때문에 좀 더 일반적인 것으로 수정해야 할 수도 있고 제목을 좁혀 야 할 수도 있습니다. 제한을 줄이면 더 많은 독자에게 더 유용 할 것입니다.
jpmc26 1

18

컨텍스트가있는 파일을 작성할 수 있습니다.

run arg1 arg2 arg3 etc

program input

그리고 gdb를 다음과 같이 호출하십시오.

gdb prog < file

4

gdb에는 --init-command <somefile>somefile에 실행할 gdb 명령 목록이 있으며,이를 사용하여 //GDB코드에 주석을 달고`

echo "file ./a.out" > run
grep -nrIH "//GDB"|
    sed "s/\(^[^:]\+:[^:]\+\):.*$/\1/g" |
    awk '{print "b" " " $1}'|
    grep -v $(echo $0|sed "s/.*\///g") >> run
gdb --init-command ./run -ex=r

스크립트로, 디버그 기호를로드하는 명령을 넣은 다음, 각 //GDB주석에 대한 중단 점을 설정하기위한 중단 명령 목록을 생성 하고 실행을 시작합니다.


4

--args매개 변수가 시스템에서 작동하지 않는 경우 (예 : Solaris 8) 다음과 같이 gdb를 시작할 수 있습니다.

gdb -ex "set args <arg 1> <arg 2> ... <arg n>"

그리고 이것을 stdin에 파일을 입력하고 "즉시 실행"하는 것과 결합 할 수 있습니다.

gdb -ex "set args <arg 1> <arg 2> ... <arg n> < <input file>" -ex "r"

2

Hugo Ideler의 답변 외에도. 접두어가 --or 또는 같은 인수를 사용할 때 -gdb와 충돌하지는 않았습니다.

gdb는 args옵션을 프로그램의 인수로 사용합니다.

처음에 나는 확신하기를 원했고, 인수 주위에 따옴표로 gdb를 실행했으며 시작시 제거되었습니다.

이것도 작동하지만 선택 사항입니다.

gdb --args executablename "--arg1" "--arg2" "--arg3"

작동하지 않습니다.

gdb --args executablename "--arg1" "--arg2" "--arg3" -tui

이 경우 -tuigdb가 아닌 내 프로그램 매개 변수로 사용됩니다.


1

너무 늦었지만 gdb세션 중에 작동하는 방법이 있습니다 .

gdb <executable>

그때

(gdb) apropos argument

이것은 많은 일치 항목을 반환하며 유용한 것은입니다 set args.

set args -- Set argument list to give program being debugged when it is started.

set args arg1 arg2 ...

그때

r

인자와 인자 개수를 main (argc, argv)에 전달하여 프로그램을 실행합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.