원격 (k) gdb를 사용하여 예를 들어로드 할 때 패닉이 발생하는 모듈의 문제를 디버깅하고 있습니다. init()
이 호출 될 때.리눅스 커널 모듈`init()`의 문제를 디버깅하는 방법은 무엇입니까?
스택 추적은 단지 do_one_initcall(mod->init)
이 충돌을 일으키는 것을 보여줍니다. gdb에로드 된 심볼 파일을 얻으려면 모듈 텍스트 섹션의 주소를 가져와로드 된 모듈을 가져와야합니다. 비지 박스에서 insmod
(1.16.1)이 -m
를 지원하지 않기 때문에
은 그래서 주소를 알아 내기 위해 nm
로부터의 오프셋 (offset)를 부가 grep modulename /proc/modules
+에 붙어있어.
그래서 저는 닭고기와 달걀 문제에 직면 해 있습니다. 모듈 로딩을 디버깅하려면 모듈을로드해야합니다. 모듈을로드하려면 다음을 수행해야합니다. 문제를 디버깅 ...
그래서 나는 현재에 대한 두 가지 옵션을 생각하고 - 주소 정보를 얻을 수있는 방법이 다음 중 하나의 printk에 의해 모듈 초기화 코드- () 어딘가에 커널 코드
이 모든 이전 호출에 mod->init()
- 그래서, 거기에 중단 점을 배치 기호 파일을로드 할 수 C과 충돌 구울 볼 ...
커널에 코드를 컴파일하는 것은 너무 번거롭기 때문에 (램 디스크를 wget하는 대신 매번 보드를 플래싱해야 할 필요가 있습니다). 'do_one_initcall()'을 깨고 나면 문제를 정확하게 지적 할 수있어서 모듈과 통신하는 유어 모드 프로세스를 시작할 때까지 충돌을 연기 할 수있었습니다. 감사. – Kimvais