From 86f4fa88161a9194d5abd83175fd3f5317be217b Mon Sep 17 00:00:00 2001 From: mpetrov Date: Mon, 20 Jan 2020 15:32:47 +0200 Subject: [PATCH] Added cygwin_backtrace() with behaviour like in Linux BACKTRACE(3) --- winsup/cygwin/common.din | 1 + winsup/cygwin/exceptions.cc | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/winsup/cygwin/common.din b/winsup/cygwin/common.din index a7b4aa2b0a..24c3de7165 100644 --- a/winsup/cygwin/common.din +++ b/winsup/cygwin/common.din @@ -391,6 +391,7 @@ cygwin_posix_path_list_p NOSIGFE cygwin_set_impersonation_token SIGFE cygwin_split_path NOSIGFE cygwin_stackdump SIGFE +cygwin_backtrace SIGFE cygwin_umount SIGFE cygwin_winpid_to_pid SIGFE daemon SIGFE diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index 3e7d7275c2..6ec6e89abc 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -460,6 +460,21 @@ cygwin_stackdump () exc.dumpstack (); } +extern "C" int +cygwin_backtrace (void **array, int size) +{ + CONTEXT c; + c.ContextFlags = CONTEXT_FULL; + RtlCaptureContext (&c); + + thestack.init ((PUINT_PTR) c._GR(bp), 0, &c); + int i; + for (i = 0; i < size && thestack++; i++) + array[i] = (void*)thestack.sf.AddrPC.Offset; + + return i; +} + #define TIME_TO_WAIT_FOR_DEBUGGER 10000 extern "C" int