diff options
author | Sunmin Lee <sunm.lee@samsung.com> | 2016-12-27 14:49:41 +0900 |
---|---|---|
committer | Sunmin Lee <sunm.lee@samsung.com> | 2016-12-27 20:39:14 +0900 |
commit | 7435d1df3bd919fe6b0f9c3cb0399dbe545d2686 (patch) | |
tree | 48ef1e57273d573b3bfdef075a69e69a8b8939f7 | |
parent | 700c19f007eac4940be732a13f031e46ec644ac1 (diff) | |
download | crash-worker-7435d1df3bd919fe6b0f9c3cb0399dbe545d2686.tar.gz crash-worker-7435d1df3bd919fe6b0f9c3cb0399dbe545d2686.tar.bz2 crash-worker-7435d1df3bd919fe6b0f9c3cb0399dbe545d2686.zip |
crash-stack: Simplify signal info
It is hard to get signal info which caused dump using ptrace.
Therefore, crash-stack prints signal number only
which came from core_pattern.
Change-Id: I6cd865a89d3e2c5dd83cfe134bb8cddec4f7f81f
Signed-off-by: Sunmin Lee <sunm.lee@samsung.com>
-rw-r--r-- | src/crash-manager/crash-manager.c | 8 | ||||
-rw-r--r-- | src/crash-stack/crash-stack.c | 45 |
2 files changed, 20 insertions, 33 deletions
diff --git a/src/crash-manager/crash-manager.c b/src/crash-manager/crash-manager.c index c003c07..8c64d78 100644 --- a/src/crash-manager/crash-manager.c +++ b/src/crash-manager/crash-manager.c @@ -88,6 +88,7 @@ static struct crash_info { char *cmd_info; char *pid_info; char *tid_info; + char *sig_info; char time_info[80]; char temp_dir[PATH_MAX]; char name[FILENAME_MAX]; @@ -212,6 +213,7 @@ static int set_crash_info(int argc, char *argv[]) struct tm loc_tm; crash_info.pid_info = argv[1]; + crash_info.sig_info = argv[4]; crash_info.cmd_info = argv[6]; if (argc > 8) crash_info.tid_info = argv[8]; @@ -456,16 +458,18 @@ static void execute_crash_modules(int argc, char *argv[], int debug) /* if (argc > 8) ret = snprintf(command, sizeof(command), - "%s --pid %s --tid %s >> %s", + "%s --pid %s --tid %s --sig %s >> %s", CRASH_STACK_PATH, crash_info.pid_info, crash_info.tid_info, + crash_info.sig_info, crash_info.info_path); else ret = snprintf(command, sizeof(command), - "%s --pid %s >> %s", + "%s --pid %s --sig %s >> %s", CRASH_STACK_PATH, crash_info.pid_info, + crash_info.sig_info, crash_info.info_path); if (ret < 0) { _E("Failed to snprintf for crash-stack command"); diff --git a/src/crash-stack/crash-stack.c b/src/crash-stack/crash-stack.c index 82be10d..250e780 100644 --- a/src/crash-stack/crash-stack.c +++ b/src/crash-stack/crash-stack.c @@ -56,7 +56,6 @@ #define STR_ANONY "[anony]" #define STR_ANONY_LEN 8 -static siginfo_t __siginfo; static FILE *outputfile = NULL; ///< global output stream static FILE *errfile = NULL; ///< global error stream @@ -66,6 +65,7 @@ static FILE *errfile = NULL; ///< global error stream enum { OPT_PID, OPT_TID, + OPT_SIGNUM, OPT_OUTPUTFILE, OPT_ERRFILE }; @@ -76,6 +76,7 @@ enum { const struct option opts[] = { { "pid", required_argument, 0, OPT_PID }, { "tid", required_argument, 0, OPT_TID }, + { "sig", required_argument, 0, OPT_SIGNUM }, { "output", required_argument, 0, OPT_OUTPUTFILE }, { "erroutput", required_argument, 0, OPT_ERRFILE }, { 0, 0, 0, 0 } @@ -382,11 +383,6 @@ static Dwfl *__open_dwfl_with_pid(pid_t pid, pid_t tid) return NULL; } - if (ptrace(PTRACE_GETSIGINFO, tid, NULL, &__siginfo) != 0) { - fprintf(errfile, "ptrace GETSIGINFO failed: %m, pid=%d, tid=%d\n", pid, tid); - return NULL; - } - static const Dwfl_Callbacks proc_callbacks = { .find_elf = dwfl_linux_proc_find_elf, .find_debuginfo = dwfl_standard_find_debuginfo, @@ -443,17 +439,14 @@ static int __get_registers_ptrace(pid_t pid) } /** - * @brief Get information about the signal that stopped the process - * - * @param pid pid of the live process - * @return 0 on success, -1 otherwise + * @brief Print signal number causing dump */ -static int __get_signal_ptrace(pid_t pid) +static void __crash_stack_print_signal(int signo) { const char* const signal_table[] = { [SIGHUP]="SIGHUP", [SIGINT]="SIGINT", [SIGQUIT]="SIGQUIT", [SIGILL]="SIGILL", [SIGTRAP]="SIGTRAP", [SIGABRT]="SIGABRT", - [SIGIOT]="SIGIOT", [SIGBUS]="SIGBUS", [SIGFPE]="SIGFPE", + /* [SIGIOT]="SIGIOT", */ [SIGBUS]="SIGBUS", [SIGFPE]="SIGFPE", [SIGKILL]="SIGKILL", [SIGUSR1]="SIGUSR1", [SIGSEGV]="SIGSEGV", [SIGUSR2]="SIGUSR2", [SIGPIPE]="SIGPIPE", [SIGALRM]="SIGALRM", [SIGTERM]="SIGTERM", [SIGSTKFLT]="SIGSTKFLT", [SIGCHLD]="SIGCHLD", @@ -465,23 +458,9 @@ static int __get_signal_ptrace(pid_t pid) }; printf("Signal: %d\n" - "\t(%s)\n" - "\tsi_code: %d\n", - __siginfo.si_signo, - signal_table[__siginfo.si_signo], - __siginfo.si_code); - switch (__siginfo.si_code) { - case SI_TKILL: - case SI_USER: - printf("\tsignal sent by %s (sent by pid %d, uid %d)", - __siginfo.si_code == SI_TKILL ? "tkill" : "kill", - __siginfo.si_pid, __siginfo.si_uid); - break; - case SI_KERNEL: - printf("\tsignal sent by the kernel\n"); - break; - } - return 0; + "\t(%s)\n", + signo, + signal_table[signo]); } /** @@ -987,6 +966,7 @@ static void __crash_stack_print_meminfo(FILE* outputfile, pid_t pid) int main(int argc, char **argv) { int c; + int signo = 0; pid_t pid = 0; pid_t tid = 0; @@ -1000,6 +980,9 @@ int main(int argc, char **argv) case OPT_TID: tid = atoi(optarg); break; + case OPT_SIGNUM: + signo = atoi(optarg); + break; case OPT_OUTPUTFILE: outputfile = fopen(optarg, "w"); break; @@ -1043,8 +1026,8 @@ int main(int argc, char **argv) __crash_stack_print_exe(outputfile, pid); /* Now, get registers */ - if (-1 == __get_signal_ptrace(pid)) - return 4444; + __crash_stack_print_signal(signo); + if (-1 == __get_registers_ptrace(tid)) return 3333; |