본문 바로가기
【Fundamental Tech】/Linux

누가 나를 호출했는지 찾기 + 포인터를 심볼 이름으로 변환하여 출력하기

반응형

▣ 원문 출처: http://www.iamroot.org/xe/index.php?mid=Lecture&document_srl=6711

Ruby Hacking Guide 의 서장에는 소스 코드를 읽는 기법에 대한 논의가 나옵니다. http://tinyurl.com/3askrg 에서 번역된 글을 볼 수 있습니다 (기계 번역이라 매우 조악하지만).

거기에서는 코드 해석 방법을 "동적 해석"과 "정적 해석"으로 나누고 있는데요. "동적 해석"이란 실제로 코드를 수정하고 실행시켜서 그 작동을 확인하는 방법을 말합니다.

여기서 동적으로 해석하는 대상이 커널인 경우, 커널 로그 메시지를 실시간으로 보는 것이 유용한데요. 저는 PC에서 작업하는 경우 터미널 창 하나를 띄워 놓고 다음과 같은 명령을 실행합니다.

tail -F /var/log/kern.log -s 0.01

----------

이상은 그냥 잡담이고요. 제가 원래 쓰고 싶은 얘기는 지금부터입니다. 동적 해석시 제가 쓰는 팁을 하나 소개드리려 합니다.

어떤 함수를 누가 호출하는지 알고 싶은데, :cs f c (vim에서 cscope로 caller를 찾는 명령) 로도 안 잡히는 경우가 있습니다. 함수 포인터에 들어있는 걸 호출하거나 복잡한 매크로를 써서 이상하게 호출하는 경우 등입니다.

이때 저는, 해당 함수의 시작 부분에 PRINT_INFO(); 라는 줄을 삽입합니다. 그 정의는 다음과 같이 넣어 줍니다.

#include <linux/kallsyms.h>

#define PRINT_INFO()
do {
    printk("%s starting( caller:", __FUNCTION__);
    print_symbol("%s)n", (unsigned long) __builtin_return_address(0));
} while (0)
반응형