인수를 전달하고 파일에서 stdin을 gdb에서 실행되는 프로그램으로 리디렉션하는 방법은 무엇입니까?


답변:


136

rungdb 내 에서 명령에 인수를 전달하십시오 .

$ gdb ./a.out
(gdb) r < t
Starting program: /dir/a.out < t

3
rrun으며 모든 인수로 따를 수 있습니다. 이 질문에서와 같이, r arg1 arg2 <file또는 다음 과 run arg1 arg2 <file
같을

나를 위해 그것은 작동하지 않습니다. 그럼 난 시도 $ gdb ./a.out(gdb) r < t arg1 arg2나를 위해 잘 작동한다. 내 경우 a.out = nft arg1 = import arg2 = jsont = file containing json rules
mystictot

410

당신은 이것을 할 수 있습니다 :

gdb --args path/to/executable -every -arg you can=think < of

마법의 비트 --args.

그냥 입력 run디버깅을 시작하기 위해 GDB 명령 콘솔에서.


24
나는 처음에 이것을 잘못 읽고 있다고 생각했다. --args가 실행 파일보다 먼저 나오는 것이 이상합니다. 그러나 그렇습니다!
Kaolin Fire

8
@Kaolin --args는 gdb 용 스위치이므로 실행 파일 앞에 와야합니다. 만약 그렇다면 gdb는 디버깅하고있는 실행 파일로 전달하고자하는 인자와 어떻게 구별 할 수 있을까요?
codehippo

9
@codehippo : 글쎄, 당신은 지정하지 않은 경우 --args다음이 없는 것이 거의 모호한 그래서 실행에 전달 된 인수.
궤도에서 가벼움 레이스

14
나는 그것이 전통적 argv[0]으로 실행 파일의 이름 이기 때문에 추측하고 있습니다
Claudiu

3
이것은 gdb자신의 입력을 of파일로 재지향 하여 gdb가 그 명령을 실행하려고 할 것입니다
unkulunkulu

4

경로 재 지정 및 인수로 프로그램을 실행하기위한 run명령 을 원한다면 gdb다음을 사용할 수 있습니다 set args.

% gdb ./a.out
(gdb) set args arg1 arg2 <file
(gdb) run

--args매개 변수를 사용 하여 동일한 동작을 수행 할 수 없었 gdb으며 리디렉션을 격렬하게 탈출했습니다.

% gdb --args echo 1 2 "<file"
(gdb) show args
Argument list to give program being debugged when it is started is "1 2 \<file".
(gdb) run
...
1 2 <file
...

이것은 실제로 우리가 실제로 원하는 것이 아니라 gdb 자체의 입력을 리디렉션합니다.

% gdb --args echo 1 2 <file
zsh: no such file or directory: file

1

프로젝트에서 GDB를 시작하십시오.

  1. 프로젝트 실행 파일을 이미 컴파일 한 프로젝트 디렉토리로 이동하십시오. 다음과 같이 gdb 명령과 실행 파일 이름을 발행하십시오.

    gdb projectExecutablename

이것은 gdb를 시작하고 다음을 인쇄합니다. GNU gdb (Ubuntu 7.11.1-0ubuntu1 ~ 16.04) 7.11.1 Copyright (C) 2016 Free Software Foundation, Inc. ............... .................................. "awords"를 입력하여 "word"와 관련된 명령을 검색하십시오. projectExecutablename ...에서 기호 읽기 ... 완료. (gdb)

  1. 프로그램 실행을 시작하기 전에 중단 점을 설정하려고합니다. break 명령을 사용하면 그렇게 할 수 있습니다. main이라는 함수의 시작 부분에 중단 점을 설정하려면 다음을 수행하십시오.

    (gdb) b 메인

  2. (gdb) 프롬프트가 표시되면 실행 명령이 실행 파일 실행을 시작합니다. 디버깅하는 프로그램에 명령 줄 인수가 필요한 경우 run 명령에 지정합니다. "xfiles"파일 (프로젝트 디렉토리의 "mulder"폴더에 있음)에서 프로그램을 실행하려면 다음을 수행하십시오.

    (gdb) r mulder / xfiles

도움이 되었기를 바랍니다.

면책 조항 :이 솔루션은 그것에서 적응, 광산하지 https://web.stanford.edu/class/cs107/guide_gdb.html GDB이 짧은 가이드는, 아마도, 스탠포드 대학에서 개발되었다.


0

쉘 레벨에서 debug디버깅 할 수 있도록 명령 앞에 입력하는 것이 좋지 gdb않습니까?

그 아래에이 기능이 있습니다. 심지어 다음과 같이 작동합니다.

"$program" "$@" < <(in) 1> >(out) 2> >(two) 3> >(three)

이것은 아무것도 제어 할 수 없으며 모든 것이 가변적이며 공백, 줄 바꿈 및 셸 메타 문자를 포함 할 수있는 호출입니다. 이 예에서 in, out, two, 및 three입지 않을 임의의 다른 소비해야 명령이나 생산 데이터이다.

다음 과 같은 환경에서 다음 bash함수가 gdb거의 깨끗하게 호출 됩니다 [ Gist ] :

debug()
{
  1000<&0 1001>&1 1002>&2 \
  0</dev/tty 1>/dev/tty 2>&0 \
  /usr/bin/gdb -q -nx -nw \
  -ex 'set exec-wrapper /bin/bash -c "exec 0<&1000 1>&1001 2>&1002 \"\$@\"" exec' \
  -ex r \
  --args "$@";
}

이것을 적용하는 방법에 대한 예 : debug앞에 입력하십시오 :

전에:

p=($'\n' $'I\'am\'evil' "  yay  ")
"b u g" "${p[@]}" < <(in) 1> >(out) 2> >(two) 3> >(three)

후:

p=($'\n' $'I\'am\'evil' "  yay  ")
debug "b u g" "${p[@]}" < <(in) 1> >(out) 2> >(two) 3> >(three)

그게 다야. 이제는 절대로 디버깅 할 필요가 없습니다 gdb. 몇 가지 세부 사항 이상을 제외하고 :

  • gdb자동 종료되지 않으므로 종료 할 때까지 IO 리디렉션을 열린 상태로 유지하십시오 gdb. 그러나 나는 이것을 기능이라고 부릅니다.

  • argv0와 같이 프로그램에 쉽게 전달할 수 없습니다 exec -a arg0 command args. 다음은이 트릭을 수행해야 합니다 .로 exec-wrapper변경 한 후 ."exec"exec -a \"\${DEBUG_ARG0:-\$1}\"

  • FD가 1000보다 높으면 정상적으로 닫힙니다. 이것이 문제라면 0<&1000 1>&1001 2>&1002읽기로 변경하십시오.0<&1000 1>&1001 2>&1002 1000<&- 1001>&- 1002>&-

  • 두 개의 디버거를 병렬로 실행할 수 없습니다. 다른 명령이 사용되는 경우 /dev/tty(또는 STDIN) 문제가있을 수도 있습니다 . 이 문제를 해결하려면, 대신 /dev/tty"${DEBUGTTY:-/dev/tty}". 다른 TTY 유형에서는 tty; sleep inf다음과 같이 인쇄용 TTY (예 : E. /dev/pts/60)를 디버깅에 사용하십시오 DEBUGTTY=/dev/pts/60 debug command arg... 그것이 쉘의 힘입니다. 익숙해 지십시오!

기능 설명 :

  • 1000<&0 1001>&1 1002>&2 처음 3 개의 FD를 멀리 이동
    • 이것은 FD 1000, 1001 및 1002가 비어 있다고 가정합니다.
  • 0</dev/tty 1>/dev/tty 2>&0현재 TTY를 가리 키도록 처음 3 개의 FD를 복원합니다. 제어 할 수 있습니다 gdb.
  • /usr/bin/gdb -q -nx -nw실행 gdb원용하는 gdb쉘을
  • -ex 'set exec-wrapper /bin/bash -c "exec 0<&1000 1>&1001 2>&1002 \"\$@\"" 시작 래퍼를 생성합니다.이 래퍼는 1000 이상에 저장된 첫 번째 3 개의 FD를 복원합니다.
  • -ex r 를 사용하여 프로그램을 시작합니다 exec-wrapper
  • --args "$@" 주어진대로 인수를 전달

쉽지 않습니까?

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