GDB에서 실행 파일을 자동으로 실행하는 방법은 무엇입니까?


92

gdb"실행"을 입력 한 것처럼 실행 파일 을 즉시 실행하고 싶습니다 (동기 : "실행"입력을 싫어합니다).

한 가지 방법은 gdb다음과 같이 명령을 파이프하는 것입니다.

$ echo run | gdb myApp

그러나이 접근 방식의 문제점은 gdb예 를 들어와의 상호 작용을 잃는다는 것입니다 . 중단 점이 트리거되거나 myApp충돌하면 gdb종료됩니다. 이 방법은 여기에서 설명 합니다 .

의 옵션을 보면이 --help작업을 수행 할 수있는 방법이 없지만 아마도 뭔가 빠진 것 같습니다.

답변:


129
gdb -ex run ./a.out

인수를 전달해야하는 경우 a.out:

gdb -ex run --args ./a.out arg1 arg2 ...

편집 : Orion 은 이것이 Mac OSX에서 작동하지 않는다고 말합니다.

-ex플래그는 GDB-6.42005 년에 출시 된 이후로 사용 가능 했지만 OSX는 Apple의 GDB 포크를 사용하고 Leopard 용 최신 XCode에는이 포함되어 GDB 6.3.50-20050815 (Apple version gdb-967)있으므로 운이 좋지 않습니다.

현재 GDB-7.0.1릴리스를 빌드하는 것이 가능한 솔루션 중 하나입니다. 그냥 읽으십시오 .


1
답변 해주셔서 감사합니다. 그 줄은 나를 위해 "gdb ./a.out"과 동일하게 작동합니다.
orion elenzil

3
명령 줄에서 여러 -ex 옵션을 전달할 수도 있으며 gdb 입력을 전송하기 전에 순서대로 실행된다는 것을 확인했습니다.
Tung Nguyen

프로그램에 다음과 같은 인수가있는 경우이 솔루션은 작동하지 않습니다../a.out a b
gigilibala

OSX / xcode는 더 이상 기본적으로 gdb를 지원하지 않기 때문에 (lldb는 새로운 gdb 임) 이제 더 나은 접근 방식으로 보입니다.
orion elenzil

명령 파일을 만들고 gdb -xLinux 시스템에서 사용합니다. OS X은 LLVMclang을 사용 하므로 lldb.
Daisuke Aramaki

23

gdb 스크립트를 사용합니다.

gdb -x your-script

여기서 당신의 스크립트가 같은 것을 포함

file a.out
b main
r

나중에 일반 대화식 gdb 프롬프트가 표시됩니다.

수정 :

다음은 진정으로 게으른 사용자를위한 최적화입니다.

  1. 로 스크립트를 저장 .gdbinit에서 working directory.
  2. 나중에 gdb를 다음과 같이 실행하면됩니다.

    gdb

... 그리고 gdb는 .gdbinit의 내용을 자동으로로드하고 실행합니다.


답변 주셔서 감사합니다. gdb 프롬프트가 표시되지 않고 gdb가 일시 중단되고 "ctrl-z"를 입력 한 것처럼 명령 줄로 돌아온다는 점을 제외하면 원하는대로 보입니다. 내가 "fg"이면 gdb가 다시 시작되고 앱이 실행됩니다. 이것은 OS X입니다.
orion elenzil

orion : mmmh-놀랍습니다. 내가 실제로 사용하는 모든 UNIX 버전 (Linux, Solaris, AIX)에서 잘 작동합니다. 사용중인 gdb 버전은 무엇입니까?

방금이 동작을 다시 확인했습니다. gdb가 일시 중단 된 상태에서 명령 줄로 계속 나갑니다. GNU gdb 6.3.50-20050815 (Apple 버전 gdb-1518) (Sat Feb 12 02:52:12 UTC)
elenzil 오리온

당신이 세우면,하지만 왜 생각 @orionelenzil fg애프터 r선이 올바로 수행 역할
DBR

start명령에 대한 바로 가기를 제공 b+ r: stackoverflow.com/a/2119606/895245
치로 틸리郝海东冠状病六四事件法轮功

20
(echo r ; cat) | gdb a.out

cat을 사용하면 gdb가 중단 된 후에도 계속 입력 할 수 있습니다.


워, 굉장해. 고양이를 중지하려면 gdb를 종료 한 후 ctrl-c를 눌러야합니다.
elenzil 오리온

3
이것을 사용하여 gdb 인스턴스에서 일부 키 제어를 잃은 것 같습니다.
Treviño

또한 같은 질문 Make breakpoint pending on future shared library load? (y or [n])은 자동으로 "아니오"로 간주됩니다.
Ruslan

6

start 명령

이 명령은 또 다른 좋은 옵션입니다.

gdb -ex start --args ./a.out arg1 arg2

실행과 같지만 임시 중단 점을 설정하고 main거기 에서 중지합니다.

이 임시 중단 점이 적중되면 비활성화됩니다.

starti

starti프로그램을 시작하고 대신 첫 번째 명령어에서 중지 하는 관련 항목도 있습니다. 참조 : GDB의 첫 번째 기계 코드 명령어에서 중지

낮은 수준의 작업을 할 때 좋습니다.


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