diff options
author | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-04-02 07:02:54 +0000 |
---|---|---|
committer | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-04-02 07:02:54 +0000 |
commit | a1a6fd90bb4045b95963788fb923a9a54fdaf502 (patch) | |
tree | 37738c5339abaefed3812606f737945e79e63fc0 /vm_dump.c | |
parent | 5376610d0c671fd9076cd8347e2aac388b93dde2 (diff) |
* vm_dump.c (rb_print_backtrace): separate to ease showing C backtrace.
* internal.h (rb_print_backtrace): ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40062 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_dump.c')
-rw-r--r-- | vm_dump.c | 54 |
1 files changed, 29 insertions, 25 deletions
@@ -675,6 +675,34 @@ dump_thread(void *arg) #endif void +rb_print_backtrace(void) +{ +#if HAVE_BACKTRACE +#define MAX_NATIVE_TRACE 1024 + static void *trace[MAX_NATIVE_TRACE]; + int n = backtrace(trace, MAX_NATIVE_TRACE); + char **syms = backtrace_symbols(trace, n); + + if (syms) { +#ifdef USE_ELF + rb_dump_backtrace_with_lines(n, trace, syms); +#else + int i; + for (i=0; i<n; i++) { + fprintf(stderr, "%s\n", syms[i]); + } +#endif + free(syms); + } +#elif defined(_WIN32) + DWORD tid = GetCurrentThreadId(); + HANDLE th = (HANDLE)_beginthread(dump_thread, 0, &tid); + if (th != (HANDLE)-1) + WaitForSingleObject(th, INFINITE); +#endif +} + +void rb_vm_bugreport(void) { #ifdef __linux__ @@ -708,32 +736,8 @@ rb_vm_bugreport(void) #if HAVE_BACKTRACE || defined(_WIN32) fprintf(stderr, "-- C level backtrace information " "-------------------------------------------\n"); + rb_print_backtrace(); - { -#if HAVE_BACKTRACE -#define MAX_NATIVE_TRACE 1024 - static void *trace[MAX_NATIVE_TRACE]; - int n = backtrace(trace, MAX_NATIVE_TRACE); - char **syms = backtrace_symbols(trace, n); - - if (syms) { -#ifdef USE_ELF - rb_dump_backtrace_with_lines(n, trace, syms); -#else - int i; - for (i=0; i<n; i++) { - fprintf(stderr, "%s\n", syms[i]); - } -#endif - free(syms); - } -#elif defined(_WIN32) - DWORD tid = GetCurrentThreadId(); - HANDLE th = (HANDLE)_beginthread(dump_thread, 0, &tid); - if (th != (HANDLE)-1) - WaitForSingleObject(th, INFINITE); -#endif - } fprintf(stderr, "\n"); #endif /* HAVE_BACKTRACE */ |