2013-06-03 3 views
0

현재 커널 모듈을 디버깅 중입니다. 따라서이 목적을 위해 전체 커널을 디버그 정보 (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으로 설정했기 때문입니다.

+0

기호 대신 특정 줄에 중단 점을 설정해 보았습니까? 또한 컴파일러가 인라인 코드를하지 않도록 할 수 있습니다. – Hasturkun

+0

일부 스트립 옵션을 사용하고 있습니까 ?? –

답변

2

사용중인 gdb의 버전을 말하지 않습니다.

gdb의 아주 오래된 버전은 인라인 기능을 지원하지 않습니다. 이것은 6.8 및 7.0의 경우에도 마찬가지였습니다. 기억하지 않습니다. gdb가 볼 수있는 NEWS 파일을 볼 수 있습니다.

그런 다음 인라인 함수에는 중단 점을 지원하지만 "file : line"구문 만 사용하는 gdb의 일부 버전이 있습니다. "GDB의

(gdb) break myfile.c:777 

더욱 최신 버전 (잊지) 7.4 또는 7.5로 시작 처리합니다 : 그래서 당신은 어떻게 할 것인지 예를 들어, 편집기의 기능을 찾아, 그 행 번호를 찾아 입력입니다 함수를 "인라인했다면"함수를 중단하십시오 ".

이 모든 것은 debuginfo를 사용할 수있는 경우에만 작동합니다. 따라서 이것을 시도해 보았을 때, 실패했다면 오래된 gdb를 가지고 있거나 -g를 사용하지 않았다.

컴파일에서 -g가 누락 된 개체를 확인하는 좋은 방법은 gdb가 아닙니다. 쉘에서 쉽게 볼 수 있지만, .o 파일에서 "readelf -WS"를 실행하고 .debug_info 섹션이없는 파일을 찾으십시오.

+0

'gdb --version'은'GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04'라고 알려줍니다. "file : line"구문을 사용하여 제안을 시도했습니다. 중단 점은 코드 경로가 도달 할 때 제대로 등록되고 히트로 표시되지만 명령은 결코 "언 래핑"되지 않습니다. – Rerito

+0

"언 래핑 된"의미, 미안 해요. –

+0

디버거가 인라인 된 함수의 내부 명령어를 표시하지 않는다는 것을 의미합니다. stepi를 사용하여 실행하면'foo (0);'행만 반복해서 표시됩니다. – Rerito

0

함수의 서명 행에 중단 점을 설정하지 못했습니다. 그러나 인라인 함수의 명령 줄에 하나를 설정하면 나를 위해 문제가 해결되었습니다. 예를 들어 inline_foo 함수를 고려하면 myfile에 있습니다.C :

inline int inline_foo(int arg) // l.1 
{ 
    int a_var = 0; 
    do_smth(&a_var); 
    do_some_other_thing(); // l.5 
    if (a_var) { 
     a_var = blob(); 
    } else { 
     a_var = blub(); 
    return a_var; // l.10 
} 

내가 b myfile.c:1을 시도하고 있었다, 일을하지 않은 것으로 보입니다. 그러나 b myfile.c:3을 대신 시도하면 GDB가 중단 점을 잘 처리합니다. 기술은 Tom이 이전에 설명한 것과 동일하기 때문에 그의 대답을 받아 들일 것입니다.

관련 문제