GDB는

2011-12-05 3 views
8

내가 gdbserver 사용하여 임베디드 장치에서 디버깅하고 함수 이름이 표시되지 않습니다 : 내 PC에서GDB는

./gdbserver HOST:5000 /home/test_app 

을,이 방법으로 GDB를 실행합니다

arm-none-linux-gnueabi-gdb test_app 

응용 프로그램이 실행되면 , 내가 디버깅 할 세그먼트 폴트를받을 수 있지만 그것을 생산 무엇을 줄 알고 불가능 :

Program received signal SIGSEGV, Segmentation fault. 
[Switching to Thread 715] 
0x31303030 in ??() 
(gdb) bt 
#0 0x31303030 in ??() 
#1 0x0000dff8 in ??() 
#2 0x0000dff8 in ??() 
Backtrace stopped: previous frame identical to this frame (corrupt stack?) 

(나는 totall 해요 말해야한다 y는 GDB를 처음 사용)

+1

컴파일 할 플래그는 무엇입니까? GDB는 소스 파일을 가져올 위치를 알고 있으므로 중지 된 행을 표시 할 수 있습니까? –

+1

이해가 안됩니다. 귀하의 PC는 ARM입니까? 그리고 GDB 서버에 연결하는 것 같지 않습니다. –

+1

컴파일러 실행 라인과 전체 GDB 명령어를 게시 하시겠습니까? Tomalak Geret'kal과 함께 여기에 뭔가 빠졌음에도 동의합니다. 최소한 GDB 서버에 연결하고 소스 디렉토리를 설정하라는 명령입니다. – thiton

답변

10

좋아입니다 .. 정보의 마지막 부분은 바이너리가 제거되었는지 여부를 설명합니다. GDB에서의 디버깅을 위해 바이너리가 제거되지 않아야합니다.

nm --debug-sym <your_executable> | grep debug 

아래와 같은 유효한 인쇄물이있는 경우 디버그 기호가 있음을 의미합니다.

00000000 N .debug_abbrev 
00000000 N .debug_aranges 
00000000 N .debug_frame 
00000000 N .debug_info 
00000000 N .debug_line 
00000000 N .debug_loc 
00000000 N .debug_pubnames 
00000000 N .debug_str 

은 또한 당신은 당신이 list 명령으로 소스를 나열 할 수 있어야한다 당신이이 시점에서 라인

Reading symbols from <your_executable>...done. 

를 follwing을해야 GDB를 호출 할 때.

gdb와 gdbserver가 모두 동일한 버전인지 확인하십시오.

arm-none-linux-gnueabi-gdb --version 
./gdbserver --version 

위의 내용이 모두 참이라면 여전히 백 트레이스를 얻지 못하면 스택에 문제가있는 것입니다. 귀하의 코드/새로 추가 된 코드에 valgrind 몇 가지 정적 분석을 실행 해보십시오.

+0

감사합니다! 나는 그것을 벗겼 을까 두렵다 ... – funkadelic

+0

나는이 대답이 사실이라고 생각하지 않는다. 보이는 함수 이름을 가진 몇 개의 스트립 된 파일을 발견했습니다 (그러나 소스는 재현 가능하지 않습니다) – Blauhirn

5

디버그 기호를 사용하여 응용 프로그램을 빌드해야합니다. GCC의 스위치는 단지 명령

file <your_executable> 

당신은 형식, 아치 등 같은 바이너리에 대한 정보를 얻을 것이다 다음 확실히 실행하기 위해 ... 디버그 기호가없는 경우이 일반적으로 발생 -g

+0

분명히 한 가지 측면이지만 gdbserver로 크로스 디버깅하는 것이 더 있습니다. OP는 질문에 대답하기에 충분한 정보를 아직 게시하지 않았습니다. – thiton

+0

내가 사용한 전체 컴파일 옵션을 지금 게시 할 수는 없지만 -g를 사용했습니다. 정보에 대해 – funkadelic

관련 문제