summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSunmin Lee <sunm.lee@samsung.com>2016-12-27 14:49:41 +0900
committerSunmin Lee <sunm.lee@samsung.com>2016-12-27 20:39:14 +0900
commit7435d1df3bd919fe6b0f9c3cb0399dbe545d2686 (patch)
tree48ef1e57273d573b3bfdef075a69e69a8b8939f7
parent700c19f007eac4940be732a13f031e46ec644ac1 (diff)
downloadcrash-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.c8
-rw-r--r--src/crash-stack/crash-stack.c45
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;