2013-01-03 5 views
6

임베디드 프로그래밍을 처음 사용하지만 임베디드 플랫폼에서 실행되는 매우 복잡한 응용 프로그램을 디버깅해야합니다. 나는 JTAG 인터페이스를 통해 GDB를 사용한다.임베디드 응용 프로그램의 메모리 문제 디버그 방법

예상치 못한 방식으로 프로그램이 충돌합니다. 이 문제는 메모리 관련 문제로 인해 발생한다고 생각합니다. GDB는 시스템이 망가진 후 완전히 응답하지 않는 상태에서 메모리를 검사 할 수 있습니까?

+2

어떤 프로세서를 사용하고 있습니까? – TJD

+0

icyflex1 (http://www.csem.ch/docs/Show.aspx/9224/docname/CSEM-STR08-Page%2023.pdf)이라는 32 비트 프로세서이며 GNU 기반 도구 체인을 사용하고 있습니다. – ricc

+2

불행히도 그 문서는 디버그를위한 CPU 기능에 대해서는 언급하지 않았습니다. Carl Norum이 언급했듯이 일반적으로 예외 상황을 파악한 다음 CPU 상태를 검사합니다. 예외가 발생할 때 PC가 무엇인지 판별 할 수있는 CPU 특정 방법이 있습니다. 일부 프로세서에는 액세스 할 수있는 나쁜 주소 나 코드 또는 데이터 버스와 같은 것을 알려주는 디버그/오류 상태 레지스터가 있습니다. – TJD

답변

6

설정에 따라 조금씩 다릅니다. 특히 JTAG을 사용하고 있기 때문에 디버거가 예외를 감지하면 프로세서를 중지하도록 설정할 수 있습니다 (예 : 불법적으로 보호 된 메모리에 액세스하는 경우). 그렇지 않은 경우 예외 처리기를 무한 루프로 바꿀 수 있습니다. 그런 다음 예외를 수동으로 해제하여 프로세서가 충돌을 일으킨 작업을 확인합니다. 일반적으로, 당신은 여전히 ​​그 상황에서 메모리에 접근 할 수 있고 GDB를 사용하여 직접 둘러 볼 수도 있고, 모든 것을 파일에 덤프하여 나중에 둘러 볼 수도 있습니다.

3

무엇이 충돌했는지에 따라 다릅니다. 시스템이 응답하지 않는 경우 (일부 무한 루프, 교착 상태 또는 이와 유사한 경우) 일반적으로 GDB에 응답하고 백 트레이스 (호출 스택) 등을 볼 수 있습니다. 시스템/버스/cpu가 실제로 (낮은 수준에서) 충돌 한 다음 아마 응답하지 않습니다. 이 경우 의심스러운 장소/변수에서 중단 점을 설정하고 어떤 일이 일어나는지 관찰 할 수 있습니다. 또한 시뮬레이터 (ISS, RTL - 해당되는 경우)를 사용하면 HW와 동작을 비교할 수 있습니다.

관련 문제