allow massif logfile option in valgrind
[framework/appfw/debug-launchpad.git] / src / launchpad.c
index f85437d..aaec35c 100755 (executable)
@@ -93,6 +93,8 @@
 #define OPT_VALGRIND_XMLFILE           "--xml-file="
 #define OPT_VALGRIND_XMLFILE_FIXED     "--xml-file=/tmp/valgrind_result.xml"
 #define PATH_VALGRIND_XMLFILE          "/tmp/valgrind_result.xml"
+#define OPT_VALGRIND_MASSIFFILE                "--massif-out-file="
+#define OPT_VALGRIND_MASSIFFILE_FIXED  "--massif-out-file=/tmp/valgrind_result.xml"
 
 #if (ARCH==arm)
 #define PATH_MEMCHECK  "/opt/home/developer/sdk_tools/valgrind/usr/lib/valgrind/memcheck-arm-linux"
@@ -111,6 +113,7 @@ static char *launchpad_cmdline;
 static int initialized = 0;
 
 static int poll_outputfile = 0;
+static int is_gdbserver_launched;
 
 void __set_oom();
 void __set_env(app_info_from_db * menu_info, bundle * kb);
@@ -887,15 +890,14 @@ int __prepare_valgrind_outputfile(bundle *kb)
                if(str_array[i] == NULL) break;
                /* valgrind log file option */
                if (strncmp(str_array[i], OPT_VALGRIND_LOGFILE
-                       , strlen(OPT_VALGRIND_LOGFILE)) == 0)
+                       , sizeof(OPT_VALGRIND_LOGFILE)-1) == 0)
                {
-                       if(strncmp(str_array[i], OPT_VALGRIND_LOGFILE_FIXED
-                               , strlen(str_array[i])))
+                       if(strcmp(str_array[i], OPT_VALGRIND_LOGFILE_FIXED))
                        {
                                _E("wrong valgrind option(%s). It should be %s"
                                        , str_array[i]
                                        , OPT_VALGRIND_LOGFILE_FIXED);
-                               return 1;
+                               return -1;
                        }else{
                                poll_outputfile |= POLL_VALGRIND_LOGFILE;
                                if(remove(PATH_VALGRIND_LOGFILE)){
@@ -906,15 +908,32 @@ int __prepare_valgrind_outputfile(bundle *kb)
                }
                /* valgrind xml file option */
                else if (strncmp(str_array[i], OPT_VALGRIND_XMLFILE
-                       , strlen(OPT_VALGRIND_XMLFILE)) == 0)
+                       , sizeof(OPT_VALGRIND_XMLFILE)-1) == 0)
                {
-                       if(strncmp(str_array[i], OPT_VALGRIND_XMLFILE_FIXED
-                               , strlen(str_array[i])))
+                       if(strcmp(str_array[i], OPT_VALGRIND_XMLFILE_FIXED))
                        {
                                _E("wrong valgrind option(%s). It should be %s"
                                        , str_array[i]
                                        , OPT_VALGRIND_XMLFILE_FIXED);
-                               return 1;
+                               return -1;
+                       }else{
+                               poll_outputfile |= POLL_VALGRIND_XMLFILE;
+                               if(remove(PATH_VALGRIND_XMLFILE)){
+                                       _D("cannot remove %s"
+                                               , PATH_VALGRIND_XMLFILE);
+                               }
+                       }
+               }
+               /* valgrind massif file option */
+               else if (strncmp(str_array[i], OPT_VALGRIND_MASSIFFILE
+                       , sizeof(OPT_VALGRIND_MASSIFFILE)-1) == 0)
+               {
+                       if(strcmp(str_array[i], OPT_VALGRIND_MASSIFFILE_FIXED))
+                       {
+                               _E("wrong valgrind option(%s). It should be %s"
+                                       , str_array[i]
+                                       , OPT_VALGRIND_MASSIFFILE_FIXED);
+                               return -1;
                        }else{
                                poll_outputfile |= POLL_VALGRIND_XMLFILE;
                                if(remove(PATH_VALGRIND_XMLFILE)){
@@ -1005,6 +1024,10 @@ int __prepare_fork(bundle *kb, char *appid)
        }
        if(str_array == NULL) return 0;
 
+       is_gdbserver_launched = 0;
+       gdbserver_pid = -1;
+       gdbserver_app_pid = -1;
+
        for (i = 0; i < len; i++) {
                if(str_array[i] == NULL) break;
                /* gdbserver */
@@ -1012,7 +1035,7 @@ int __prepare_fork(bundle *kb, char *appid)
                {
                        if(apply_smack_rules("sdbd",appid,"w")) {
                                _E("unable to set sdbd rules");
-                               return 1;
+                               return -1;
                        }
 
                        // FIXME: set gdbfolder to 755 also
@@ -1025,12 +1048,14 @@ int __prepare_fork(bundle *kb, char *appid)
                        }
                        __adjust_file_capability(PATH_GDBSERVER);
                        need_to_set_inh_cap_after_fork++;
+                       is_gdbserver_launched++;
                }
                /* valgrind */
                else if (strncmp(str_array[i], SDK_VALGRIND
                        , strlen(str_array[i])) == 0)
                {
-                       if (__prepare_valgrind_outputfile(kb)) return 1;
+                       if (__prepare_valgrind_outputfile(kb) == -1) 
+                               return -1;
                        __adjust_file_capability(PATH_MEMCHECK);
                }
        }
@@ -1190,7 +1215,7 @@ void __launchpad_main_loop(int main_fd)
 
        PERF("get package information & modify bundle done");
 
-       if(__prepare_fork(kb,appid)) goto end;
+       if(__prepare_fork(kb,appid) == -1) goto end;
 
        pid = fork();
        if (pid == 0) {
@@ -1231,6 +1256,21 @@ void __launchpad_main_loop(int main_fd)
                exit(-1);
        }
 
+       if(is_gdbserver_launched) {
+               char buf[MAX_LOCAL_BUFSZ];
+
+               usleep(100 * 1000);     /* 100ms sleep */
+               snprintf(buf, MAX_LOCAL_BUFSZ, "%s.exe", app_path);
+               gdbserver_app_pid = __proc_iter_cmdline(NULL, buf);
+
+               if(gdbserver_app_pid == -1) {
+                       _E("faild to get app pid");
+               } else {
+                       gdbserver_pid = pid;
+                       pid = gdbserver_app_pid;
+               }
+       }
+
        _D("==> real launch pid : %d %s\n", pid, app_path);
        is_real_launch = 1;