lcc/pylcc/lib/lbcStack.py (62 lines of code) (raw):
# -*- coding: utf-8 -*-
"""
-------------------------------------------------
File Name: lbcUstack
Description :
Author : liaozhaoyan
date: 2022/10/23
-------------------------------------------------
Change Activity:
2022/10/23:
-------------------------------------------------
"""
__author__ = 'liaozhaoyan'
import re
from surftrace.surfElf import CelfSym
class ClbcUstack(object):
def __init__(self, pid, addrs):
super(ClbcUstack, self).__init__()
self._pid = pid
self._addrs = addrs
self._mmap = self._loadMmaps()
self._elfs = {}
def _loadMmaps(self):
pathName = "/proc/%d/maps" % self._pid
with open(pathName, 'r') as f:
lines = f.readlines()
maps = []
for line in lines:
line = re.sub(r" +", " ", line.strip())
cells = line.split(' ')
if 'x' in cells[1]:
start, end = cells[0].split('-')
d = {"start": int(start, 16), "end": int(end, 16)}
if len(cells) == 5:
d["path"] = None
else:
d["path"] = cells[5]
maps.append(d)
return maps
def _queryElf(self, addr):
for mmap in self._mmap:
if mmap['start'] <= addr < mmap['end']:
return mmap["path"], mmap['start']
raise OSError("addr 0x%x is an illegal value" % addr)
def dumpStacks(self):
lines = []
for addr in self._addrs:
if addr == 0:
break
try:
fPath, start = self._queryElf(addr)
except OSError:
break
addr -= start
if fPath not in self._elfs:
self._elfs[fPath] = CelfSym(fPath)
sym, offset = self._elfs[fPath].addr2sym(addr)
lines.append("%s + 0x%x" % (sym, offset))
return lines
def getKStacks(maps, stack_id, elfSym, sLen=-1):
arr = []
stks = maps.getArr(stack_id)
if stks is not None:
if sLen == -1:
sLen = len(stks)
for i in range(sLen):
if stks[i] != 0:
name, _ = elfSym.ksymSearch(stks[i])
arr.append(name)
else:
break
return arr
if __name__ == "__main__":
pass