나는 보통 다음과 같이 프로그램을 실행합니다.
./a.out arg1 arg2 <file
gdb를 사용하여 디버깅하고 싶습니다.
set args
기능을 알고 있지만 gdb 프롬프트에서만 작동합니다.
답변
run
gdb 내 에서 명령에 인수를 전달하십시오 .
$ 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를 시작하십시오.
-
프로젝트 실행 파일을 이미 컴파일 한 프로젝트 디렉토리로 이동하십시오. 다음과 같이 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)
-
프로그램 실행을 시작하기 전에 중단 점을 설정하려고합니다. break 명령을 사용하면 그렇게 할 수 있습니다. main이라는 함수의 시작 부분에 중단 점을 설정하려면 다음을 수행하십시오.
(gdb) b 메인
-
(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 "$@"
주어진대로 인수를 전달
쉽지 않습니까?