문제

작은 Linux 기반 SBC (~ 32MB RAM)에서 실행되는 응용 프로그램을 개발하고 있습니다. 슬프게도, 내 앱은 최근에 더 이상 GDB에서 실행하기에는 너무 커졌습니다. 내장 된 Linux에서 사용할 수있는 좋은 가벼운 디버깅 방법을 아는 사람이 있습니까? 스레드의 스택 추적을 볼 수 있더라도 매우 도움이 될 것입니다.

이 응용 프로그램은 C ++로 작성되어 여러 스레드를 실행한다고 언급해야하므로 GDBServer는 멀티 스레드 앱에서 작동하지 않기 때문에 이동하지 않습니다.

미리 감사드립니다.

마하

도움이 되었습니까?

해결책

GDBSERVER는 분명히 멀티 스레드 애플리케이션과 함께 작동합니다. 저는 지금> 25 개의 스레드로 임베디드 프로젝트를 진행하고 있으며 GDBSERVER를 항상 사용합니다.

info threads 

시스템의 모든 스레드를 나열합니다

thread <thread number from info threads>  

해당 실행 스레드로 전환됩니다.

thread apply XXX <command>  

XXX로 지정된 스레드에서 실행되며 '모두'일 수도 있습니다. 따라서 모든 실행중인 스레드에서 뒷면 트레이스를 원한다면

thread apply all bt

주어진 스레드의 실행 흐름에 있으면 모든 일반적인 명령은 단일 스레드 프로세스에서와 같이 작동합니다.

다른 팁

QEMU와 같은 에뮬레이터에서 응용 프로그램을 실행 한 다음 GDB (또는 Valgrind와 같은 것)를 실행하는 것과 같은 해킹을하는 사람들이 들었습니다. 고통 스럽지만 작동한다면 ....

Libunwind (스택 흔적을 얻기 위해)와 Printf 스타일 로깅을 통해 어디에도 가겠습니까?

직렬 포트 인쇄는 호스트 PC에서 쉽게 볼 수있는 가장 가벼운 무게이며 앱 내부에서 간단하고 가벼운 코드 ~~

직렬 포트가없는 경우, 일단 GPIO 포트를 사용하고이를 사용하여 직렬 포트를 시뮬레이션했습니다. 완벽하게 잘 작동했지만 조금 느 렸습니다 :-( ~~~

자신의 디버거를 구축 한 이유가 있습니까? ARM 프로세서 (AT91SAM926X)를 사용하여 Linux 시스템을 개발하고 있으며 CodesOrcery에서 컴파일러와 디버거를 모두 사용하고 있습니다. 아직 GDB 7과 함께 버전을 출시했다고 생각하지는 않지만 문제없이 GDBSERVER 도구를 사용하여 멀티 스레드 C ++ 응용 프로그램을 디버깅하고 있습니다.

gdbserver는 실제로 멀티 스레드 애플리케이션에서 작동합니다. 그러나 호스트가 대상 GDB와 협력 할 수 있도록 크로스 대상 디버거를 컴파일해야합니다.

수행 방법에 대한 자세한 설명은이 기사를 참조하십시오.

GDB 및 GDBServer를 사용한 원격 크로스 타겟 디버깅

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