summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHwankyu Jhun <h.jhun@samsung.com>2016-12-02 14:02:04 +0900
committerHwankyu Jhun <h.jhun@samsung.com>2016-12-02 14:02:04 +0900
commitf328e4d82111555c4b00a90a8b9ed60b5ed607fa (patch)
treecbc7cbb5f3bcfe6bde9407b8f7e73709da1c1d0c
parentc6dfe10089afcc9962c72efd8ae01f5fa2a369f6 (diff)
downloadlaunchpad-f328e4d82111555c4b00a90a8b9ed60b5ed607fa.tar.gz
launchpad-f328e4d82111555c4b00a90a8b9ed60b5ed607fa.tar.bz2
launchpad-f328e4d82111555c4b00a90a8b9ed60b5ed607fa.zip
- Add extra data on debugger option Change-Id: I511302dea6a999e8154a84ee73affe3c1c0b2269 Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
-rw-r--r--inc/debugger_info.h1
-rw-r--r--inc/launchpad_debug.h1
-rw-r--r--packaging/default.debugger.in6
-rw-r--r--src/debugger_info.c32
-rwxr-xr-xsrc/launchpad.c17
-rw-r--r--src/launchpad_debug.c96
6 files changed, 137 insertions, 16 deletions
diff --git a/inc/debugger_info.h b/inc/debugger_info.h
index 7f61846..22bd253 100644
--- a/inc/debugger_info.h
+++ b/inc/debugger_info.h
@@ -29,5 +29,6 @@ GList *_debugger_info_get_extra_key_list(debugger_info_h info);
GList *_debugger_info_get_extra_env_list(debugger_info_h info);
GList *_debugger_info_get_unlink_list(debugger_info_h info);
const char *_debugger_info_get_attach(debugger_info_h info);
+GList *_debugger_info_get_last_extra_key_list(debugger_info_h info);
#endif /* __DEBUGGER_INFO_H__ */
diff --git a/inc/launchpad_debug.h b/inc/launchpad_debug.h
index 8bdb6ef..a866270 100644
--- a/inc/launchpad_debug.h
+++ b/inc/launchpad_debug.h
@@ -20,6 +20,7 @@
#include <stdbool.h>
#include <bundle.h>
+int _debug_create_extra_argv(int *arg, char ***argv);
int _debug_create_argv(int *argc, char ***argv, bool *attach);
void _debug_destroy_argv(int argc, char **argv);
int _debug_get_caller_pid(bundle *kb);
diff --git a/packaging/default.debugger.in b/packaging/default.debugger.in
index ee2e717..7b8428d 100644
--- a/packaging/default.debugger.in
+++ b/packaging/default.debugger.in
@@ -18,3 +18,9 @@ EXE /opt/usr/home/owner/share/tmp/sdk_tools/gdbserver/gdbserver
APP_TYPE capp|c++app
EXTRA_KEY __DLP_ATTACH_ARG__
ATTACH true
+
+[DEBUGGER]
+NAME UNIT_TEST
+APP_TYPE capp|c++app
+LAST_EXTRA_KEY __DLP_UNIT_TEST_ARG__
+
diff --git a/src/debugger_info.c b/src/debugger_info.c
index 4af4a2d..8e7d446 100644
--- a/src/debugger_info.c
+++ b/src/debugger_info.c
@@ -25,14 +25,15 @@
#include "launchpad_common.h"
#include "debugger_info.h"
-#define TAG_DEBUGGER "[DEBUGGER]"
-#define TAG_NAME "NAME"
-#define TAG_EXE "EXE"
-#define TAG_APP_TYPE "APP_TYPE"
-#define TAG_EXTRA_KEY "EXTRA_KEY"
-#define TAG_EXTRA_ENV "EXTRA_ENV"
-#define TAG_UNLINK "UNLINK"
-#define TAG_ATTACH "ATTACH"
+#define TAG_DEBUGGER "[DEBUGGER]"
+#define TAG_NAME "NAME"
+#define TAG_EXE "EXE"
+#define TAG_APP_TYPE "APP_TYPE"
+#define TAG_EXTRA_KEY "EXTRA_KEY"
+#define TAG_EXTRA_ENV "EXTRA_ENV"
+#define TAG_UNLINK "UNLINK"
+#define TAG_ATTACH "ATTACH"
+#define TAG_LAST_EXTRA_KEY "LAST_EXTRA_KEY"
struct debugger_info_s {
char *name;
@@ -42,6 +43,7 @@ struct debugger_info_s {
GList *extra_env_list;
GList *unlink_list;
char *attach;
+ GList *last_extra_key_list;
};
static struct debugger_info_s *__create_debugger_info(void)
@@ -64,6 +66,8 @@ static void __destroy_debugger_info(gpointer data)
if (info == NULL)
return;
+ if (info->last_extra_key_list)
+ g_list_free_full(info->last_extra_key_list, free);
if (info->attach)
free(info->attach);
if (info->unlink_list)
@@ -175,6 +179,10 @@ static GList *__parse_file(GList *list, const char *path)
info = NULL;
break;
}
+ } else if (strcasecmp(TAG_LAST_EXTRA_KEY, tok1) == 0) {
+ info->last_extra_key_list = g_list_append(
+ info->last_extra_key_list,
+ strdup(tok2));
}
}
fclose(fp);
@@ -293,3 +301,11 @@ const char *_debugger_info_get_attach(debugger_info_h info)
return info->attach;
}
+
+GList *_debugger_info_get_last_extra_key_list(debugger_info_h info)
+{
+ if (info == NULL)
+ return NULL;
+
+ return info->last_extra_key_list;
+}
diff --git a/src/launchpad.c b/src/launchpad.c
index 4cf0919..a1d4618 100755
--- a/src/launchpad.c
+++ b/src/launchpad.c
@@ -590,6 +590,7 @@ static int __create_app_argv(int *argc, char ***argv, const char *app_path,
struct app_arg debug_arg = {0,};
struct app_arg launcher_arg = {0,};
struct app_arg arg = {0,};
+ struct app_arg debug_extra_arg = {0,};
int ret;
int i;
int c;
@@ -606,10 +607,19 @@ static int __create_app_argv(int *argc, char ***argv, const char *app_path,
return 0;
}
+ ret = _debug_create_extra_argv(&debug_extra_arg.argc,
+ &debug_extra_arg.argv);
+ if (ret < 0) {
+ _E("Failed to create debugger extra argv");
+ _debug_destroy_argv(debug_arg.argc, debug_arg.argv);
+ return -1;
+ }
+
ret = __create_launcher_argv(&launcher_arg.argc, &launcher_arg.argv,
app_type);
if (ret < 0) {
_E("Failed to create launcher argv");
+ _debug_destroy_argv(debug_extra_arg.argc, debug_extra_arg.argv);
_debug_destroy_argv(debug_arg.argc, debug_arg.argv);
return -1;
}
@@ -618,12 +628,14 @@ static int __create_app_argv(int *argc, char ***argv, const char *app_path,
if (arg.argc <= 0) {
_E("Failed to export bundle");
__destroy_launcher_argv(launcher_arg.argc, launcher_arg.argv);
+ _debug_destroy_argv(debug_extra_arg.argc, debug_extra_arg.argv);
_debug_destroy_argv(debug_arg.argc, debug_arg.argv);
return -1;
}
arg.argv[LOADER_ARG_PATH] = strdup(app_path);
- new_argc = debug_arg.argc + launcher_arg.argc + arg.argc;
+ new_argc = debug_arg.argc + launcher_arg.argc + arg.argc +
+ debug_extra_arg.argc;
if (new_argc == arg.argc) {
*argc = arg.argc;
*argv = arg.argv;
@@ -636,6 +648,7 @@ static int __create_app_argv(int *argc, char ***argv, const char *app_path,
free(arg.argv[LOADER_ARG_PATH]);
bundle_free_exported_argv(arg.argc, &arg.argv);
__destroy_launcher_argv(launcher_arg.argc, launcher_arg.argv);
+ _debug_destroy_argv(debug_extra_arg.argc, debug_extra_arg.argv);
_debug_destroy_argv(debug_arg.argc, debug_arg.argv);
return -1;
}
@@ -647,6 +660,8 @@ static int __create_app_argv(int *argc, char ***argv, const char *app_path,
new_argv[c++] = launcher_arg.argv[i];
for (i = 0; i < arg.argc; i++)
new_argv[c++] = arg.argv[i];
+ for (i = 0; i < debug_extra_arg.argc; i++)
+ new_argv[c++] = debug_extra_arg.argv[i];
*argc = new_argc;
*argv = new_argv;
diff --git a/src/launchpad_debug.c b/src/launchpad_debug.c
index 0065f1f..4ead375 100644
--- a/src/launchpad_debug.c
+++ b/src/launchpad_debug.c
@@ -34,14 +34,58 @@
static int debug_initialized;
static GList *debugger_info_list;
static debugger_info_h debugger_info;
+static GList *debug_argv_list;
static GList *extra_argv_list;
+int _debug_create_extra_argv(int *argc, char ***argv)
+{
+ int new_argc;
+ char **new_argv;
+ const char *extra_argv;
+ GList *iter;
+ int i;
+
+ if (argc == NULL || argv == NULL) {
+ _E("[DEBUG] Invalid parameter");
+ return -1;
+ }
+
+ if (debugger_info == NULL)
+ return 0;
+
+ new_argc = g_list_length(extra_argv_list);
+ if (new_argc == 0)
+ return 0;
+
+ new_argv = (char **)calloc(new_argc, sizeof(char *));
+ if (new_argv == NULL) {
+ _E("out of memory");
+ return -1;
+ }
+
+ i = LOADER_ARG_PATH;
+ iter = g_list_first(extra_argv_list);
+ while (iter) {
+ extra_argv = (const char *)iter->data;
+ if (extra_argv)
+ new_argv[i++] = strdup(extra_argv);
+
+ iter = g_list_next(iter);
+ }
+
+ *argc = new_argc;
+ *argv = new_argv;
+ _D("[DEBUG] argc: %d, i: %d", argc, i);
+
+ return 0;
+}
+
int _debug_create_argv(int *argc, char ***argv, bool *attach)
{
int new_argc;
char **new_argv;
const char *exe;
- const char *extra_argv;
+ const char *debug_argv;
const char *attach_str;
GList *iter;
int i;
@@ -56,13 +100,13 @@ int _debug_create_argv(int *argc, char ***argv, bool *attach)
exe = _debugger_info_get_exe(debugger_info);
if (exe == NULL)
- return -1;
+ return 0;
attach_str = _debugger_info_get_attach(debugger_info);
if (attach_str && strcasecmp(attach_str, "true") == 0)
*attach = true;
- new_argc = g_list_length(extra_argv_list) + 1;
+ new_argc = g_list_length(debug_argv_list) + 1;
new_argv = (char **)calloc(new_argc, sizeof(char *));
if (new_argv == NULL) {
_E("out of memory");
@@ -72,11 +116,11 @@ int _debug_create_argv(int *argc, char ***argv, bool *attach)
i = LOADER_ARG_PATH;
new_argv[i++] = strdup(exe);
- iter = g_list_first(extra_argv_list);
+ iter = g_list_first(debug_argv_list);
while (iter) {
- extra_argv = (const char *)iter->data;
- if (extra_argv)
- new_argv[i++] = strdup(extra_argv);
+ debug_argv = (const char *)iter->data;
+ if (debug_argv)
+ new_argv[i++] = strdup(debug_argv);
iter = g_list_next(iter);
}
@@ -198,6 +242,41 @@ static void __add_extra_argv(gpointer data, gpointer user_data)
bundle_del(kb, key);
}
+static void __add_debug_argv(gpointer data, gpointer user_data)
+{
+ const char *key = (const char *)data;
+ bundle *kb = (bundle *)user_data;
+ const char *str;
+ const char **str_arr = NULL;
+ int len = 0;
+ int i;
+
+ if (key == NULL || kb == NULL)
+ return;
+
+ _D("[DEBUG] key: %s", key);
+ if (bundle_get_type(kb, key) & BUNDLE_TYPE_ARRAY) {
+ str_arr = bundle_get_str_array(kb, key, &len);
+ } else {
+ str = bundle_get_val(kb, key);
+ if (str) {
+ str_arr = &str;
+ len = 1;
+ }
+ }
+
+ for (i = 0; i < len; i++) {
+ if (str_arr[i] == NULL)
+ break;
+
+ debug_argv_list = g_list_append(debug_argv_list,
+ strdup(str_arr[i]));
+ }
+
+ if (str_arr)
+ bundle_del(kb, key);
+}
+
static void __set_debug_env(gpointer data, gpointer user_data)
{
const char *key = (const char *)data;
@@ -282,6 +361,9 @@ void _debug_prepare_debugger(bundle *kb)
g_list_foreach(list, __set_debug_env, kb);
list = _debugger_info_get_extra_key_list(debugger_info);
+ g_list_foreach(list, __add_debug_argv, kb);
+
+ list = _debugger_info_get_last_extra_key_list(debugger_info);
g_list_foreach(list, __add_extra_argv, kb);
}