Brad Bishop | c342db3 | 2019-05-15 21:57:59 -0400 | [diff] [blame] | 1 | From 0a53e906510cce1f32bc04a11e81ea40f834dac4 Mon Sep 17 00:00:00 2001 |
| 2 | From: =?UTF-8?q?An=C3=ADbal=20Lim=C3=B3n?= <anibal.limon@linux.intel.com> |
| 3 | Date: Wed, 12 Aug 2015 15:11:30 -0500 |
| 4 | Subject: [PATCH] cpus.c: Add error messages when qemi_cpu_kick_thread fails. |
| 5 | MIME-Version: 1.0 |
| 6 | Content-Type: text/plain; charset=UTF-8 |
| 7 | Content-Transfer-Encoding: 8bit |
| 8 | |
| 9 | Add custom_debug.h with function for print backtrace information. |
| 10 | When pthread_kill fails in qemu_cpu_kick_thread display backtrace and |
| 11 | current cpu information. |
| 12 | |
| 13 | Upstream-Status: Inappropriate |
| 14 | Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com> |
| 15 | |
| 16 | --- |
| 17 | cpus.c | 5 +++++ |
| 18 | custom_debug.h | 24 ++++++++++++++++++++++++ |
| 19 | 2 files changed, 29 insertions(+) |
| 20 | create mode 100644 custom_debug.h |
| 21 | |
| 22 | diff --git a/cpus.c b/cpus.c |
| 23 | index e83f72b4..e6e2576e 100644 |
| 24 | --- a/cpus.c |
| 25 | +++ b/cpus.c |
| 26 | @@ -1769,6 +1769,8 @@ static void *qemu_tcg_cpu_thread_fn(void *arg) |
| 27 | return NULL; |
| 28 | } |
| 29 | |
| 30 | +#include "custom_debug.h" |
| 31 | + |
| 32 | static void qemu_cpu_kick_thread(CPUState *cpu) |
| 33 | { |
| 34 | #ifndef _WIN32 |
| 35 | @@ -1781,6 +1783,9 @@ static void qemu_cpu_kick_thread(CPUState *cpu) |
| 36 | err = pthread_kill(cpu->thread->thread, SIG_IPI); |
| 37 | if (err && err != ESRCH) { |
| 38 | fprintf(stderr, "qemu:%s: %s", __func__, strerror(err)); |
| 39 | + fprintf(stderr, "CPU #%d:\n", cpu->cpu_index); |
Brad Bishop | c68388fc | 2019-08-26 01:33:31 -0400 | [diff] [blame] | 40 | + cpu_dump_state(cpu, stderr, 0); |
Brad Bishop | c342db3 | 2019-05-15 21:57:59 -0400 | [diff] [blame] | 41 | + backtrace_print(); |
| 42 | exit(1); |
| 43 | } |
| 44 | #else /* _WIN32 */ |
| 45 | diff --git a/custom_debug.h b/custom_debug.h |
| 46 | new file mode 100644 |
| 47 | index 00000000..f029e455 |
| 48 | --- /dev/null |
| 49 | +++ b/custom_debug.h |
| 50 | @@ -0,0 +1,24 @@ |
| 51 | +#include <execinfo.h> |
| 52 | +#include <stdio.h> |
| 53 | +#define BACKTRACE_MAX 128 |
| 54 | +static void backtrace_print(void) |
| 55 | +{ |
| 56 | + int nfuncs = 0; |
| 57 | + void *buf[BACKTRACE_MAX]; |
| 58 | + char **symbols; |
| 59 | + int i; |
| 60 | + |
| 61 | + nfuncs = backtrace(buf, BACKTRACE_MAX); |
| 62 | + |
| 63 | + symbols = backtrace_symbols(buf, nfuncs); |
| 64 | + if (symbols == NULL) { |
| 65 | + fprintf(stderr, "backtrace_print failed to get symbols"); |
| 66 | + return; |
| 67 | + } |
| 68 | + |
| 69 | + fprintf(stderr, "Backtrace ...\n"); |
| 70 | + for (i = 0; i < nfuncs; i++) |
| 71 | + fprintf(stderr, "%s\n", symbols[i]); |
| 72 | + |
| 73 | + free(symbols); |
| 74 | +} |