2010-04-09 5 views
3

원격 (k) gdb를 사용하여 예를 들어로드 할 때 패닉이 발생하는 모듈의 문제를 디버깅하고 있습니다. init()이 호출 될 때.리눅스 커널 모듈`init()`의 문제를 디버깅하는 방법은 무엇입니까?

스택 추적은 단지 do_one_initcall(mod->init)이 충돌을 일으키는 것을 보여줍니다. gdb에로드 된 심볼 파일을 얻으려면 모듈 텍스트 섹션의 주소를 가져와로드 된 모듈을 가져와야합니다. 비지 박스에서 insmod (1.16.1)이 -m를 지원하지 않기 때문에

은 그래서 주소를 알아 내기 위해 nm로부터의 오프셋 (offset)를 부가 grep modulename /proc/modules +에 붙어있어.

그래서 저는 닭고기와 달걀 문제에 직면 해 있습니다. 모듈 로딩을 디버깅하려면 모듈을로드해야합니다. 모듈을로드하려면 다음을 수행해야합니다. 문제를 디버깅 ...

그래서 나는 현재에 대한 두 가지 옵션을 생각하고 - 주소 정보를 얻을 수있는 방법이 다음 중 하나의 printk에 의해 모듈 초기화 코드
  • 에서의 printk()에 의해

    1. () 어딘가에 커널 코드

    이 모든 이전 호출에 mod->init() - 그래서, 거기에 중단 점을 배치 기호 파일을로드 할 수 C과 충돌 구울 볼 ...

  • 답변

    5

    당신은 커널에 코드를 오히려 만들 수있는 충돌 모듈보다? 그러면 init() 호출 디버깅이 간단해질 수 있습니다.

    do_one_initcall()에 중단 점을 설정하고 mod->init 주소를보고로드 주소를 가져올 수도 있습니다.

    +0

    커널에 코드를 컴파일하는 것은 너무 번거롭기 때문에 (램 디스크를 wget하는 대신 매번 보드를 플래싱해야 할 필요가 있습니다). 'do_one_initcall()'을 깨고 나면 문제를 정확하게 지적 할 수있어서 모듈과 통신하는 유어 모드 프로세스를 시작할 때까지 충돌을 연기 할 수있었습니다. 감사. – Kimvais