현재 커널 모듈을 디버깅 중입니다. 따라서이 목적을 위해 전체 커널을 디버그 정보 (kallsyms 등을 생성합니다)로 빌드했습니다.일부 디버그 기호가없는 이유는 무엇입니까?
nm my_module.ko
을 시도하면 모듈에 포함 된 기호 목록이 표시됩니다. 기호 목록에 나타나지 않는 일부 기호가 누락 된 경우를 제외하고 모두 모두 괜찮습니다. 이것에 대한 내 생각은 관련 함수가 자동으로 인라인됩니다.
어쨌든 qemu-kgdb/gdb를 사용하여 커널을 실행할 때 "누락 된"기능이 호출되었음을 알 수 있습니다. 이것은 컴파일러가 어떤 코드 경로에서도 사용되지 않았기 때문에 그것을 지우지 않았다는 것을 의미합니다 (따라서 "느낌").
기호가 나타나지 않기 때문에 중단 점을 설정할 수없고 실행중인 코드 경로를 볼 수 있도록 gdb에서이를 실행하지 않습니다. 이해하십시오. gdb에서 언롤을 수행하는 방법을 모르겠습니다. 그것.
불행히도 코드 경로의이 부분을보고 싶습니다 ... 어떻게 그렇게 할 수 있습니까?
편집 : 톰의 대답에 제안, 나는 아래와 같이 file:line
구문을 사용하여 시도 :
내 코드 파일은 다음과 같습니다
int foo(int arg) // The function that I suspect to be inlined - here is line 1
{
/* Blabla */
return 42;
}
void foo2(void)
{
foo(0); // Line 9
}
내가 b file.c:1
을 시도하고 중단 점을 맞았 그러나 foo()
함수는 전개되지 않습니다. 물론 디버그 기호를 생성하고 있는데, 어떤 일이 일어 났는지 확인하기 위해 중단 점을 foo2
으로 설정했기 때문입니다.
기호 대신 특정 줄에 중단 점을 설정해 보았습니까? 또한 컴파일러가 인라인 코드를하지 않도록 할 수 있습니다. – Hasturkun
일부 스트립 옵션을 사용하고 있습니까 ?? –