0

"작은"리눅스를 사용하는 보드에서 드라이버를 개발하는 일은 완전히 새롭습니다. 모든 것을 만들고 PC에서 ".bin"파일을 가져온 다음 ".bin"을 ftp로 가져올 때마다 시스템이 작동합니다.GDB가없는 보드에서 리눅스 커널을 디버그하십시오

이제 문제가 발생했습니다. 시스템을 검사했는데 gdb를 사용할 수 없습니다. 그래서 시스템이 망가질 때, 그것은 지저분한 주소 정보를 제공하는 코어 덤프 파일을 제공 할 것입니다. (도움이되지 않거나 적어도 이걸 어떻게 사용하는지 전혀 모릅니다.)

숙련 된 임베디드 개발자는 어떤 제안을 해주실 수 있습니까? 어떻게 당신의 작업에서 디버깅?

그런데 콘솔 인쇄 크래시 정보에 스택 정보와 통화 추적이 포함되어 있으면 epc 및 ra (방금 배웠습니다). epc (추락 된 주소)가 아직 발견 될 수 있습니까?

+0

디버그 출력의 의미는 무엇입니까? printf 출력에 사용할 수있는 UART를 가지고 있습니까? 단일 스테핑 및/또는 메모리 검사를위한 JTAG 인터페이스? – Throwback1986

+0

@ Throwback1986 PC 콘솔로 인쇄하려면 UART가 있어야합니다. 매우 원시적 인 것처럼 보입니다. 그리고 시스템을 느리게하는 너무 많은 것을 인쇄 할 수 없습니다. –

+0

printk를 사용한 디버깅은 원시적 인 것처럼 보일 수 있지만 코드 나 상황이 중단 점을 허용하지 않는 경우 효과적입니다. C (및 프로그램/시스템)를 알고 있으면 코드를 책상에서 확인하면 99.9 %의 버그를 잡을 수 있습니다. 체계적으로 (예 : 맨 페이지를 읽고 모든 주요 반환 코드를 테스트) 방어 적으로 (예 : assert()의 자유 사용) 코드를 작성해야합니다. 컴파일러 경고를 수정하십시오. 자세한 정보를 제어하려면 debug_flag 변수를 사용하고 어떤 인쇄본이 활성 대 비활성인지 (즉, 항상 모든 printk를 활성화하지 마십시오). 패닉의 경우 자세한 패닉을 활성화하고 기호를 제거하지 마십시오. – sawdust

답변

2

자신을 비롯한 많은 커널 개발자는 장치 드라이버를 개발할 때 디버거를 사용하지 않습니다. 수년 동안 Linux는 커널 디버깅을 지원하지 않았습니다. 지금도 모든 CPU 아키텍처가 커널 디버깅을 지원하는 것은 아닙니다.

가장 쉬운 방법 중 하나는 printk를 사용하여 이벤트를 콘솔에 기록하는 것입니다. 또한 콘솔 UART 속도를 높입니다. 자주 115200 보오를 사용합니다.

일부 CPU 아키텍처의 경우 Linux 커널이 kgdb를 지원합니다. 에 의해

+0

고마워요! 즉, 메모리 관련 버그가있는 경우 어떤 코드 줄이 실제로 충돌을 일으키는 지 찾기가 매우 어려울 것입니다. 권장 도구는 무엇입니까? –

관련 문제