if (null == selfSymbol) {
selfSymbol = SymbolManager.addr2func(binPath, selfAddr, isPieBuild,
baseAddr);
- // FIXME : demangling debug
- String prevSelf = selfSymbol;
selfSymbol = SymbolNameDemangler.nameDemangle(selfSymbol);
- System.out.println("[Self] Demangling in makeCallstack : "
- + prevSelf + " to " + selfSymbol);
selfSymbol = getUserFunctionPosition()
+ AnalyzerConstants.CALLSTACK_API_TOKEN_STRING + selfSymbol;
addrMap.put(self, new String(selfSymbol));
if (null == callerSymbol) {
callerSymbol = SymbolManager.addr2func(binPath, callerAddr,
isPieBuild, baseAddr);
- String prevCaller = callerSymbol;
callerSymbol = SymbolNameDemangler.nameDemangle(callerSymbol);
- System.out.println("[Caller] Demangling in makeCallstack : "
- + prevCaller + " to " + callerSymbol);
callerSymbol = getUserFunctionPosition()
+ AnalyzerConstants.CALLSTACK_API_TOKEN_STRING
+ callerSymbol;
CallStackData cd = new CallStackData(lastNum);
HashMap<Long, String> addrMap = getCallStackApiByAddrMap();
List<CallStackApi> addrList = getCallStackApiList();
+
+ String prevPath = ""; //$NON-NLS-1$
+ String currentPath = null;
int size = callstackLog.size();
+ System.out.println("new callstack :" + lastNum);
for (int i = 1; i + 1 < size; i += 2) {
+ currentPath = null;
if (callstackLog.get(i).equals(AnalyzerConstants.CALLSTACK_END)
|| callstackLog.get(i + 1).equals(
AnalyzerConstants.CALLSTACK_END)) {
} catch (NumberFormatException e) {
e.printStackTrace();
}
- String funcName = addrMap.get(addr);
+ String symbolFullName = addrMap.get(addr);
- if (null == funcName || funcName.isEmpty()) {
- funcName = callstackLog.get(i + 1);
- if (funcName.isEmpty()) {
+ if (null == symbolFullName || symbolFullName.isEmpty()) {
+ symbolFullName = callstackLog.get(i + 1);
+ if (symbolFullName.isEmpty()) {
continue;
}
+ }
- String[] name = funcName
- .split(AnalyzerConstants.CALLSTACK_API_OFFSET_TOKEN);
- String fns[] = name[0].split("\\(");
- String inputName = null;
- if (fns.length > 1) {
- String dmfn = SymbolNameDemangler.nameDemangle(fns[1]);
- inputName = new String(fns[0] + "(" + dmfn);
- } else {
- inputName = new String(name[0]);
+ String[] pathOffset = symbolFullName
+ .split(AnalyzerConstants.CALLSTACK_API_OFFSET_TOKEN);
+ String pathFunc[] = pathOffset[0].split("\\(");
+ if (pathFunc.length < 2) {
+ currentPath = pathFunc[0];
+ if (prevPath.equals(currentPath)) {
+ continue;
}
- addrMap.put(addr, inputName);
- CallStackApi cas = new CallStackApi(addr, inputName);
- addrList.add(cas);
+ prevPath = currentPath;
}
- if (checkUserCall(funcName)
+ String inputName = null;
+ if (pathFunc.length > 1) {
+ String dmfn = SymbolNameDemangler.nameDemangle(pathFunc[1]);
+ inputName = new String(pathFunc[0] + "(" + dmfn);
+ } else {
+ inputName = new String(pathOffset[0]);
+ }
+ addrMap.put(addr, inputName);
+ CallStackApi cas = new CallStackApi(addr, inputName);
+ addrList.add(cas);
+
+ if (checkUserCall(symbolFullName)
&& (userFunctionBin == null || userFunctionBin.isEmpty())) {
int appType = Integer.parseInt(AnalyzerManager.getProject()
.getAppInfo().get(AnalyzerConstants.APP_INFO_APP_TYPE));
- String[] name = funcName
+ String[] dname = symbolFullName
.split(AnalyzerConstants.CALLSTACK_API_OFFSET_TOKEN);
- String input[] = name[0]
+ String input[] = dname[0]
.split(AnalyzerConstants.CALLSTACK_API_TOKEN);
if (appType != AnalyzerConstants.APP_TYPE_OSP) {
userFunctionBin = new String(input[0]);
// System.out.println("set ufp " + userFunctionBin); //$NON-NLS-1$
}
cd.getAddrs().add(addr);
- }
+ }// end of callstack start-end
getCallStackDataBySeqMap().put(lastNum, cd);
}