Networking

[NSX] How to convert unresolved address to function and line number

haewon83 2024. 5. 18. 10:22

 

내부에서 Symbol을 이용한 Debugging을 진행하는 경우가 간혹 있습니다.

이러한 경우, Debug용 Package를 별도로 Download 받거나 또는 datapath의 Performanace 분석을 위해 고객사에 해당 파일을 전달하여 수집하는 경우도 있습니다.

 

문제는 고객사에 해당 파일을 전달하여 자료를 수집하는데도 정상적으로 Address가 Function Name으로 Resolve 되지 않는 경우 내부에서 수동으로 해당 Address를 변환해야 하는 경우도 생깁니다.

 

이러한 경우, addr2line 도구를 이용하여 Base Address와 Function Address를 참조하여 올바른 Function Name으로 변환을 시도해 볼 수 있습니다.

 

아래는 datapathd 프로세스에 대해 진행해봤던 내용입니다.

 

[Prerequisites]
1. addr2line
2. debug용 datapathd
3. /proc/<pid of datapathd>/maps

 

[테스트]
1. /proc/<pid of datapathd>/maps 를 통해  확인

이를 통해 Base Address를 확인할 수 있습니다.

# ps aux | grep datapathd
root        9713 1602  0.2 69073564 914240 ?     Rl    2023 1537301:16 /opt/vmware/nsx-edge/sbin/datapathd --no-chdir --unixctl=/var/run/vmware/edge/dpd.ctl --pidfile=/var/run/vmware/edge/dpd.pid -vconsole:err -vsyslog:info --syslog-method=udp:127.0.0.1 --cfgfile=/config/vmware/edge/config.json
root      963960  0.0  0.0   6776  2052 pts/0    S+   00:58   0:00 grep --color=auto datapathd
 
# cat /proc/9713/maps
180aa7a00000-180aa8ff1000 r-xp 00000000 08:03 455982                     /opt/vmware/nsx-edge/sbin/datapathd
...
 
180aa7a00000 : Base Address >>>>>>>>>>>>>>>>>>>>>>



2. Convert할 Address 확인

아래 예제는 BM Edge에서 perf top 도구를 이용하여, 특정 Core(아래 예제에서는 2번 Core)에서 어떤 함수가 얼마만큼의 CPU Cycle을 사용하고 있는지 Sampling된 결과입니다.

하지만, 아래 보시는 바와 같이 정상적으로 Function Name을 확인할 수가 없습니다.

# perf top -C 2
Samples: 7K of event 'cycles', 4000 Hz, Event count (approx.): 6094202636 lost: 0/0 drop: 0/0
Overhead  Shared Object     Symbol
   5.11%  [unknown]         [.] 0x0000180aa7d45167 >>>>>>>>>>>>>>>>>>>>>>
   2.66%  [unknown]         [.] 0x0000180aa7d451e4
...

 

3. 함수 주소 계산

2번 단계에서 확인한 주소에서 Base Address 주소를 뺀 Offset을 구합니다.

Base Address : 180aa7a00000
Address : 0x0000180aa7d45167
 
func_address = Address - Base Address
0x0000180aa7d45167 - 0x180aa7a00000 = 0x345167

 

4. addr2line 도구를 이용하여 datapathd에서 0x345167 주소에 위치한 함수 확인

addr2line 도구를 통해 해당 Offset에 위치한 함수가 무엇이고, Source Code에서 몇 번째 Line에 위치하는지도 확인할 수 있습니다.

jhaewon@8RKNGY3-OOBE-01:~/tmp$ addr2line -e datapathd_22104642 -f -s 0x345167
###_main_loop >>>>>>>>>>>>>>>>>>>>>> Function Name
main-loop.c:###

 

5. 다음과 같이 여러 확인이 필요한 주소를 Script 형태로 작성하여 addr2line 도구를 활용해 볼 수도 있습니다.

for address in $address_list                                                  
do                                                                            
        diff_addr=$(( $address - $base_address ))                                 
        func_address=$(printf "0x%X" $diff_addr)                                  
        addr2line -e datapathd -f -s $func_address                                                                                                                 
done