어떤 함수 a() 가 다양한 프로세스에 의에 빈번하게 호출 된다면, log 로 남길 때, 누가 본인을 호출 했는지 확인 하고자 하는 경우가 있다.
실험 환경은 Ubuntu Linux 5.3.1 계열의 x86_64 아키텍쳐 이다.
backtrac 를 사용하는 예)
#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int nptrs;
void *buffer[BT_BUF_SIZE];
char **strings;
nptrs = backtrace(buffer, BT_BUF_SIZE);
rintf("backtrace() returned %d addresses\n", nptrs);
strings = backtrace_symbols(buffer, nptrs);
if (strings == NULL) {
perror("backtrace_symbols");
exit(EXIT_FAILURE);
}
for (int j = 0; j < nptrs; j++)
printf("%s\n", strings[j]);
free(strings)
실행 결과)
backtrace() returned 14 addresses
0x43a40f - Newest -> Call 을 받은 본인 function
0x43d63e -> 우리는 이 녀석에 관심이 많습니다.
0x43d28f
0x43b9e0
0x4169bf
0x4bd627
0x47ac46
0x47c833
0x47c60d
0x47a844
0x47bc9d
0x5fd386
0x5fd975
0x4015d9 - oldest
https://man7.org/linux/man-pages/man3/backtrace.3.html
backtrac() 는 the number of addresses 를 buffer 안에 return 한다.
2) __builtin_return_address() 사용예
printf("calle function = 0x%x\n", __builtin_return_address(0)); //print_trace()의 return address 를 가리킴
printf("caller function = 0x%x\n", __builtin_return_address(1)); //main()의 return address를 가리킴
그러면, 해당 address 가 무슨 function 인지는 어떻게 알 수 있는가?
Makefile을 아래와 같이 변경해서 compile 하면, output.map 이 생성 됩니다.
LDFLAGS+= -Wl,--whole-archive,-lpthread -Wl,--no-whole-archive -static -Wl,-Map=output.map
0x43d63e 이것이 관심 있는 adddress입니다.
output.map 을 열면, 아래와 같이 address vs Class:Function() 으로 되어 있는 mapping list를 확인 할 수 있습니다. 0x43d63e 자체는 없습니다. 하지만, 0x43d63e 가 포함된 function() 영역을 찾을 수 있습니다.
ReleaseMMToken() 이라는 함수가 0x43d60c 부터 시작하고, SetTrigger(bool) 이라는 함수가 0x43d640 부터 시작합니다. 그렇기 때문에 0x43d60c 는 ReleaseMMToken() 이라는 것을 알 수 있습니다.
'Linux_system' 카테고리의 다른 글
Linux Memory 관리 (0) | 2022.12.09 |
---|---|
Linux 가상 메모리의 응용 #1 - file map (0) | 2022.12.09 |
apue.3e 컴파일 하기 (0) | 2022.12.09 |
User ID/Group ID (0) | 2022.12.09 |
POSIX.1 이 뭐지? (0) | 2022.12.09 |