나는 보통 다음과 같이 프로그램을 실행합니다.
./a.out arg1 arg2 <file
gdb를 사용하여 디버깅하고 싶습니다.
set args
기능을 알고 있지만 gdb 프롬프트에서만 작동합니다.
나는 보통 다음과 같이 프로그램을 실행합니다.
./a.out arg1 arg2 <file
gdb를 사용하여 디버깅하고 싶습니다.
set args
기능을 알고 있지만 gdb 프롬프트에서만 작동합니다.
답변:
당신은 이것을 할 수 있습니다 :
gdb --args path/to/executable -every -arg you can=think < of
마법의 비트 --args
.
그냥 입력 run
디버깅을 시작하기 위해 GDB 명령 콘솔에서.
--args
다음이 없는 것이 거의 모호한 그래서 실행에 전달 된 인수.
argv[0]
으로 실행 파일의 이름 이기 때문에 추측하고 있습니다
gdb
자신의 입력을 of
파일로 재지향 하여 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를 멀리 이동
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 "$@"
주어진대로 인수를 전달쉽지 않습니까?
r
짧run
으며 모든 인수로 따를 수 있습니다. 이 질문에서와 같이,r arg1 arg2 <file
또는 다음 과run arg1 arg2 <file