'대상 원격'을 사용하여 gdb에서 프로그램 실행을 어떻게 다시 시작합니까?

StackOverflow https://stackoverflow.com/questions/75255

  •  09-06-2019
  •  | 
  •  

문제

동일한 컴퓨터의 실행 파일에 대해 일반적인 gdb 세션을 수행할 때 run 명령을 내리면 프로그램이 다시 시작됩니다.

target localhost:3210' 명령과 같이 임베디드 시스템에서 gdb를 실행할 때 gdb 세션을 종료하고 다시 시작하지 않고 어떻게 프로그램을 다시 시작할 수 있습니까?

도움이 되었습니까?

해결책

다른 팁

안타깝게도 애플리케이션을 다시 시작하고 세션을 계속 유지하는 방법을 모르겠습니다.해결 방법은 PC를 프로그램의 진입점으로 다시 설정하는 것입니다.다음 중 하나를 호출하여 이 작업을 수행할 수 있습니다.

jump 기능

또는

set $pc=주소.

인수를 다음과 같이 섞은 경우 main 다시 설정해야 할 수도 있습니다.

편집하다:

위의 방법에는 문제를 일으킬 수 있는 몇 가지 주의 사항이 있습니다.

  • 다중 스레드 프로그램에서 메인으로 점프하는 경우 현재 스레드가 메인으로 점프하고 다른 모든 스레드는 그대로 유지됩니다.현재 스레드가 잠금을 보유하고 있다면...몇 가지 문제가 있는 것입니다.
  • 메모리 누수, 초기화 중에 프로그램 흐름이 일부 항목을 할당하는 경우 점프로 인해 많은 메모리가 누수된 것입니다.
  • 열려 있는 파일은 계속 열려 있습니다.일부 파일이나 주소를 mmap하면 호출이 실패할 가능성이 높습니다.

따라서 점프를 사용하는 것은 프로그램을 다시 시작하는 것과는 다릅니다.

아마도 임베디드 시스템에서 gdbserver를 실행하고 있을 것입니다.

다음을 사용하여 종료하는 대신 프로그램을 다시 시작하도록 요청할 수 있습니다. 대상 확장-원격

"jump _start"가 일반적인 방법입니다.

나에게 설명 된 방법은 21.2 샘플 GDB 세션 시작 훌륭하게 작동합니다.내가 들어갈 때 monitor reset halt 나중에 "(gdb)" 프롬프트에서 대상 하드웨어가 재설정되고 다음을 사용하여 애플리케이션을 다시 시작할 수 있습니다. c (= 계속).

그만큼 load 프로그램을 계속해서 플래시할 필요가 없기 때문에 실행 사이에 명령을 생략할 수 있습니다.

단계별 절차

원격:

# pwd contains cross-compiled ./myexec
gdbserver --multi :1234

현지의:

# pwd also contains the same cross-compiled ./myexec
gdb -ex 'target extended-remote 192.168.0.1:1234' \
    -ex 'set remote exec-file ./myexec' \
    --args ./myexec arg1 arg2
(gdb) r
[Inferior 1 (process 1234) exited normally]
(gdb) r
[Inferior 1 (process 1235) exited normally]
(gdb) monitor exit

우분투 14.04에서 테스트되었습니다.

다음과 같이 CLI 인수를 프로그램에 전달할 수도 있습니다.

gdbserver --multi :1234 ./myexec arg1 arg2

그리고 ./myexec 부분은 필요성을 제거합니다 set remote exec-file ./myexec, 그러나 여기에는 다음과 같은 문제점이 있습니다.

환경 변수를 전달하고 다시 시작하지 않고 작업 디렉터리를 변경합니다. gdbserver --multi를 다시 시작하지 않고 환경 변수와 작업 디렉토리를 수정하는 방법은 무엇입니까?

일반 gdb를 실행 중인 경우 'run' 단축키 'r'을 입력하면 gdb에서 프로그램을 다시 시작할 것인지 묻습니다.

EFM32 Happy Gecko에서는 어떤 제안도 나에게 적합하지 않으므로 GDB를 Eclipse 환경에 통합하는 방법에 대한 문서에서 배운 내용은 다음과 같습니다.

(gdb) mon reset 0
(gdb) continue
(gdb) continue

이로 인해 IDE에서 재설정을 눌렀을 때 예상했던 상태가 됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top