[Title] fix NullPointerException, add debuginfo shell script
authorwoojin <woojin2.jung@samsung.com>
Sat, 9 Nov 2013 05:32:20 +0000 (14:32 +0900)
committerwoojin <woojin2.jung@samsung.com>
Sat, 9 Nov 2013 05:32:20 +0000 (14:32 +0900)
[Desc.] fix NullPointerException inside SWAPCallstackManager.makeCallstackWithoutBacktrace, add debuginfo script for rpm extraction
[Issue]

org.tizen.dynamicanalyzer.workbench/dynamic-analyzer/tool/debuginfo.sh [new file with mode: 0755]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/callstack/SWAPCallStackManager.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/profiling/ProfileDataMaker.java

diff --git a/org.tizen.dynamicanalyzer.workbench/dynamic-analyzer/tool/debuginfo.sh b/org.tizen.dynamicanalyzer.workbench/dynamic-analyzer/tool/debuginfo.sh
new file mode 100755 (executable)
index 0000000..3f87661
--- /dev/null
@@ -0,0 +1,59 @@
+#!/bin/bash
+FIND=/usr/bin/find
+RPM_COMMAND=/usr/bin/rpm2cpio
+
+print_usage()
+{
+       echo "Usage: debuginfo [options] [arguments]"
+       echo "Options:"
+       echo "-r                        extract rpm package"
+       echo "-f                        find files"
+}
+
+find_file()
+{
+       echo $1
+       echo $2
+       cd $1
+       find . -name $2
+}
+
+extract()
+{
+       echo $1
+       echo $2
+       echo $3
+       cd $1
+       rpm2cpio $2 | cpio -imd
+       rpm2cpio $3 | cpio -imd
+}
+
+if [[ -n $1 ]]; then
+       case "$1" in
+               -f)
+                       if [[ "$#" -ne 3 ]]; then
+                               echo "find needs two arguments!"
+                               exit 1
+                       fi
+                       shift
+                       find_file $@
+                       ;;
+               -r)
+                       if [[ "$#" -ne 4 ]]; then
+                               echo "extract needs three arguments!"
+                               exit 1
+                       fi
+                       shift
+                       extract $@
+                       ;;
+               *)
+                       echo "unknown option!"
+                       print_usage
+                       ;;
+       esac
+else
+       print_usage
+fi
+
+
+
index 1e4bbc5..3f6a120 100644 (file)
@@ -55,25 +55,26 @@ public class SWAPCallStackManager extends BaseCallstackManager {
 
        public void makeUserCallstack(LogData input, ProfileDataMaker profiler) {
                ProfileData log = (ProfileData) input;
+               int pid = log.getPid();
+               long time = log.getTime();
+               
                HashMap<Long, CallStackUnit> addrMap = getCallStackApiByAddrMap();
-               boolean isPieBuild = AnalyzerUtil.isPieBuild(log.getPid(),
-                               log.getTime());
+               boolean isPieBuild = AnalyzerUtil.isPieBuild(pid, time);
                String baseAddr = Long.toString(AnalyzerManager.getProject()
-                               .getBaseAddress(log.getPid(), log.getTime()));
-               String sourceBinPath = AnalyzerUtil.getBinarySourcePath(input.getPid(),
-                               input.getTime());
+                               .getBaseAddress(pid, time));
+               String sourceBinPath = AnalyzerUtil.getBinarySourcePath(pid, time);
                if (null == sourceBinPath || sourceBinPath.isEmpty()) {
                        return;
                }
-               String strSelfAddr = Long.toString(log.getPcAddr());
-               String strCallerAddr = Long.toString(log.getCallerPcAddr());
 
                int seq = log.getSeq();
                int tid = log.getTid();
-               long time = log.getTime();              
 
                long selfAddr = log.getPcAddr();
                long callerAddr = log.getCallerPcAddr();
+               
+               String strSelfAddr = Long.toString(selfAddr);
+               String strCallerAddr = Long.toString(callerAddr);               
 
                CallStackData callstackData = new CallStackData(seq);
                CallStackUnit selfCallstackUnit = addrMap.get(selfAddr);
@@ -112,7 +113,7 @@ public class SWAPCallStackManager extends BaseCallstackManager {
                        if (size == 0) {
                                userCallstack.add(new CallStackItem(selfCallstackUnit, time));
                        } else {
-                               if (!AnalyzerUtil.isAddrInBinaryRange(log.getPid(), log.getTime(), callerAddr)) {
+                               if (!AnalyzerUtil.isAddrInBinaryRange(pid, time, callerAddr)) {
                                        CallStackUnit callbackApi = new CallStackUnit(
                                                        LogCenterConstants.USER_FUNCTION_CALLBACK_FUNC_ADDR,
                                                        LogCenterConstants.USER_FUNCTION_CALLBACK_FUNC_SYMBOL,
@@ -242,26 +243,27 @@ public class SWAPCallStackManager extends BaseCallstackManager {
                }
                
                HashMap<Long, CallStackUnit> addrMap = getCallStackApiByAddrMap();
+               int pid;
+               long time;
                boolean isPieBuild;
-               String baseAddr, binPath;
+               String baseAddr, sourceBinPath;
                if(isProfileData) {
-                       isPieBuild = AnalyzerUtil.isPieBuild(pData.getPid(),
-                                       pData.getTime());
+                       pid = pData.getPid();
+                       time = pData.getTime();
+                       isPieBuild = AnalyzerUtil.isPieBuild(pid, time);
                        baseAddr = Long.toString(AnalyzerManager.getProject()
-                                       .getBaseAddress(pData.getPid(), pData.getTime()));
-                       binPath = AnalyzerUtil.getProcessLocalBinaryPath(pData.getPid(),
-                                       pData.getTime());
-                       
+                                       .getBaseAddress(pid, time));
+                       sourceBinPath = AnalyzerUtil.getBinarySourcePath(pid, time);
                } else {
-                       isPieBuild = AnalyzerUtil.isPieBuild(log.getPid(),
-                                       log.getTime());
+                       pid = log.getPid();
+                       time = log.getTime();                   
+                       isPieBuild = AnalyzerUtil.isPieBuild(pid, time);
                        baseAddr = Long.toString(AnalyzerManager.getProject()
-                                       .getBaseAddress(log.getPid(), log.getTime()));
-                       binPath = AnalyzerUtil.getProcessLocalBinaryPath(log.getPid(),
-                                       log.getTime());
+                                       .getBaseAddress(pid, time));
+                       sourceBinPath = AnalyzerUtil.getBinarySourcePath(pid, time);
                }
 
-               if (null == binPath || binPath.isEmpty()) {
+               if (null == sourceBinPath || sourceBinPath.isEmpty()) {
                        return;
                }
 
@@ -300,7 +302,7 @@ public class SWAPCallStackManager extends BaseCallstackManager {
                CallStackData callstackData = new CallStackData(seq);
 
                if ((size == 0) || 
-                               (!AnalyzerUtil.isAddrInBinaryRange(log.getPid(), log.getTime(), callerAddr))) {
+                               (!AnalyzerUtil.isAddrInBinaryRange(pid, time, callerAddr))) {
                        CallStackUnit callbackApi = new CallStackUnit(
                                        LogCenterConstants.USER_FUNCTION_CALLBACK_FUNC_ADDR,
                                        LogCenterConstants.USER_FUNCTION_CALLBACK_FUNC_SYMBOL, inputData);
@@ -318,7 +320,7 @@ public class SWAPCallStackManager extends BaseCallstackManager {
                } else {
                        CallStackUnit callerCallstackUnit = addrMap.get(callerAddr);
                        if (null == callerCallstackUnit) {
-                               String strCallerFuncName = SymbolManager.addr2func(binPath,
+                               String strCallerFuncName = SymbolManager.addr2func(sourceBinPath,
                                                strCallerAddr, isPieBuild, baseAddr);
                                String strCallerSymbol = getUserFunctionPosition()
                                                + AnalyzerConstants.CALLSTACK_API_TOKEN_STRING
index ed8e91d..51c1f5c 100644 (file)
@@ -123,6 +123,7 @@ public class ProfileDataMaker {
                appBinName = null;
                totalSampleCount = 0;
                getSymbolSeqHash().clear();
+               callstackTreeByTidMap.clear();
        }
 
        public BaseCallstackManager getCallstackManager() {