인수를 전달하고 파일에서 stdin을 gdb에서 실행되는 프로그램으로 리디렉션하는 방법은 무엇입니까? 프로그램을 실행합니다. ./a.out arg1 arg2 <file gdb를

나는 보통 다음과 같이 프로그램을 실행합니다.

./a.out arg1 arg2 <file

gdb를 사용하여 디버깅하고 싶습니다.

set args기능을 알고 있지만 gdb 프롬프트에서만 작동합니다.



답변

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

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


답변

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

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

마법의 비트 --args.

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


답변

경로 재 지정 및 인수로 프로그램을 실행하기위한 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


답변

프로젝트에서 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이 짧은 가이드는, 아마도, 스탠포드 대학에서 개발되었다.


답변

쉘 레벨에서 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 "$@" 주어진대로 인수를 전달

쉽지 않습니까?


답변