diff options
author | Łukasz Stelmach <l.stelmach@samsung.com> | 2016-10-20 12:14:53 +0200 |
---|---|---|
committer | Łukasz Stelmach <l.stelmach@samsung.com> | 2016-12-08 13:51:36 +0100 |
commit | 9c3bf3fb2f53e171a2c46a43ef34c312c9878604 (patch) | |
tree | a42d0b902a342b82541a7e478e3f8ced0ad866dd /src/crash-stack | |
parent | b6df9cafb1fe97c153993d027af21eaff82616b8 (diff) | |
download | crash-worker-9c3bf3fb2f53e171a2c46a43ef34c312c9878604.tar.gz crash-worker-9c3bf3fb2f53e171a2c46a43ef34c312c9878604.tar.bz2 crash-worker-9c3bf3fb2f53e171a2c46a43ef34c312c9878604.zip |
crash-stack: Print register values
Change-Id: If8d82aa32eb524ffb23715af6016f0fec12bd144
Diffstat (limited to 'src/crash-stack')
-rw-r--r-- | src/crash-stack/crash-stack-aarch64.c | 27 | ||||
-rw-r--r-- | src/crash-stack/crash-stack-arm.c | 24 | ||||
-rw-r--r-- | src/crash-stack/crash-stack-x86_64.c | 28 | ||||
-rw-r--r-- | src/crash-stack/crash-stack.c | 3 | ||||
-rw-r--r-- | src/crash-stack/crash-stack.h | 8 | ||||
-rw-r--r-- | src/crash-stack/wind/unwarm.h | 2 |
6 files changed, 91 insertions, 1 deletions
diff --git a/src/crash-stack/crash-stack-aarch64.c b/src/crash-stack/crash-stack-aarch64.c index 6333a45..4e8ef32 100644 --- a/src/crash-stack/crash-stack-aarch64.c +++ b/src/crash-stack/crash-stack-aarch64.c @@ -96,3 +96,30 @@ void *_get_place_for_register_value(const char *regname, int regnum) return &g_regs.x30; return NULL; } + +#define PSR_MODE32_BIT 0x00000010 +#define PSR_MODE_MASK 0x0000000f + +void _crash_stack_print_regs(FILE* outputfile) +{ + int i,top_reg; + + if ((g_registers.pstate & (PSR_MODE32_BIT | PSR_MODE_MASK)) == PSR_MODE32_BIT) { + top_reg = 12; + } else { + top_reg = 29; + } + + fprintf(outputfile, "\nRegister Information\n"); + fprintf(outputfile, "pc : [<%016llx>] lr : [<%016llx>] pstate: %08llx\n", + g_registers.pc, g_registers.regs[30], g_registers.pstate); + fprintf(outputfile, "sp : %016llx\n", g_registers.sp); + + for (i = top_reg; i >= 0; i--) { + fprintf(outputfile, "x%-2d: %016llx ", i, g_registers.regs[i]); + if ((i%2) == 0) { + fprintf(outputfile,"\n"); + } + } + fprintf(outputfile,"\n"); +} diff --git a/src/crash-stack/crash-stack-arm.c b/src/crash-stack/crash-stack-arm.c index 7ad3b9b..e02f324 100644 --- a/src/crash-stack/crash-stack-arm.c +++ b/src/crash-stack/crash-stack-arm.c @@ -190,3 +190,27 @@ void _create_crash_stack(Dwfl *dwfl, Elf *core, pid_t pid, Mappings *mappings, C UnwStartArm(&state); } +void _crash_stack_print_regs(FILE* outputfile) +{ + fprintf(outputfile, "\nRegister Information\n"); + fprintf(outputfile, "pc : [<%08lx>] lr : [<%08lx>] psr: %08lx\n", + g_ptrace_registers.uregs[REG_PC], g_ptrace_registers.uregs[REG_LR], + g_ptrace_registers.uregs[REG_SPSR] + ); + fprintf(outputfile, "sp : %08lx ip : %08lx fp : %08lx\n", + g_ptrace_registers.uregs[REG_SP], g_ptrace_registers.uregs[REG_IP], + g_ptrace_registers.uregs[REG_FP] + ); + fprintf(outputfile, "r10: %08lx r9 : %08lx r8 : %08lx\n", + g_ptrace_registers.uregs[10], g_ptrace_registers.uregs[9], + g_ptrace_registers.uregs[8] + ); + fprintf(outputfile, "r7 : %08lx r6 : %08lx r5 : %08lx r4 : %08lx\n", + g_ptrace_registers.uregs[7], g_ptrace_registers.uregs[6], + g_ptrace_registers.uregs[5], g_ptrace_registers.uregs[4] + ); + fprintf(outputfile, "r3 : %08lx r2 : %08lx r1 : %08lx r0 : %08lx\n", + g_ptrace_registers.uregs[3], g_ptrace_registers.uregs[2], + g_ptrace_registers.uregs[1], g_ptrace_registers.uregs[0] + ); +} diff --git a/src/crash-stack/crash-stack-x86_64.c b/src/crash-stack/crash-stack-x86_64.c index 174b2f4..1690c7a 100644 --- a/src/crash-stack/crash-stack-x86_64.c +++ b/src/crash-stack/crash-stack-x86_64.c @@ -42,3 +42,31 @@ void _crash_stack_set_ptrace_registers(void *regbuf) memcpy(rsp, ®s->rsp, sizeof(regs->rsp)); memcpy(rip, ®s->rip, sizeof(regs->rip)); } + +void _crash_stack_print_regs(FILE* outputfile) +{ +#define _PRINT_REGISTERS(a,b,c) \ + fprintf(outputfile, "%3s: %016lx %3s: %016lx %3s: %016lx\n", \ + #a, g_registers.a, \ + #b, g_registers.b, \ + #c, g_registers.c) + fprintf(outputfile, "\nRegister Information\n"); +#ifdef __x86_64__ + fprintf(outputfile, "rip: %04lx:[<%016lx>]\n", + g_registers.cs & 0xffff, + g_registers.rip); + fprintf(outputfile, "rsp: %04lx:%016lx eflags: %08lx\n", + g_registers.ss, + g_registers.rsp, + g_registers.eflags); + _PRINT_REGISTERS(rax, rbx, rcx); + _PRINT_REGISTERS(rdx, rsi, rdi); + _PRINT_REGISTERS(rbp, r8, r9); + _PRINT_REGISTERS(r10, r11, r12); + _PRINT_REGISTERS(r13, r14, r15); +#else + fprintf(outputfile, "Unsupported architecture\n") +#endif + fprintf(outputfile, "\n"); +#undef _PRINT_REGISTERS +} diff --git a/src/crash-stack/crash-stack.c b/src/crash-stack/crash-stack.c index 71c3114..2fc64fd 100644 --- a/src/crash-stack/crash-stack.c +++ b/src/crash-stack/crash-stack.c @@ -738,6 +738,9 @@ int main(int argc, char **argv) _create_crash_stack(dwfl, core, pid, &mappings, &callstack); + /* Print registers */ + _crash_stack_print_regs(outputfile); + /* Print the results */ __print_callstack(&callstack, dwfl, core, pid, notes); diff --git a/src/crash-stack/crash-stack.h b/src/crash-stack/crash-stack.h index e5d3f20..3dfccef 100644 --- a/src/crash-stack/crash-stack.h +++ b/src/crash-stack/crash-stack.h @@ -119,7 +119,7 @@ bool _crash_stack_libelf_read_value(Dwfl *dwfl, Elf *core, pid_t pid, void *_crash_stack_get_memory_for_ptrace_registers(size_t *size); /** - * @brief Sets current values of registers from ptrace buffer + * @brief Sets current values of registers from the ptrace buffer * * @param regbuf buffer used for getting registers with ptrace() * @@ -127,4 +127,10 @@ void *_crash_stack_get_memory_for_ptrace_registers(size_t *size); */ void _crash_stack_set_ptrace_registers(void *regbuf); +/** + * @brief Print values of registers from the ptrace buffer + * + * @param outputfile output stream + */ +void _crash_stack_print_regs(FILE* outputfile); #endif /* CRASH_STACK_H */ diff --git a/src/crash-stack/wind/unwarm.h b/src/crash-stack/wind/unwarm.h index b75b6cb..5cff863 100644 --- a/src/crash-stack/wind/unwarm.h +++ b/src/crash-stack/wind/unwarm.h @@ -98,6 +98,8 @@ typedef struct MemData; #define REGS_REGULAR_NUM 13 +#define REG_FP 11 +#define REG_IP 12 #define REG_SP 13 #define REG_LR 14 #define REG_PC 15 |