Linux_system

Linux , caller (호출자) 가 누구인지 아는 방법

MasterOfAI 2022. 12. 9. 23:24

어떤 함수 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

 

backtrace(3) - Linux manual page

 

man7.org

 

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