summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory LEOCADIE <gregory.leocadie@datadoghq.com>2023-01-05 16:13:29 +0100
committerDave Watson <dade.watson@gmail.com>2023-01-11 08:56:12 -0800
commitb1d6f6efe425c93ba5d692f6c6be53d3ef52606d (patch)
treeee137dbff73a44df2a00f75fc24ea21af498ad37
parentd75341299b5002b6cdc30682314d5538ed1e17f2 (diff)
downloadlibunwind-b1d6f6efe425c93ba5d692f6c6be53d3ef52606d.tar.gz
Adjust backtrace2 signatureHEADv1.7.0-rc2master
-rw-r--r--doc/unw_backtrace.man14
-rw-r--r--doc/unw_backtrace.tex6
-rw-r--r--include/libunwind-common.h.in2
-rw-r--r--src/mi/backtrace.c6
-rw-r--r--tests/Gtest-trace.c2
5 files changed, 19 insertions, 11 deletions
diff --git a/doc/unw_backtrace.man b/doc/unw_backtrace.man
index 91a693ab..e1a4a9df 100644
--- a/doc/unw_backtrace.man
+++ b/doc/unw_backtrace.man
@@ -1,7 +1,7 @@
.\" *********************************** start of \input{common.tex}
.\" *********************************** end of \input{common.tex}
'\" t
-.\" Manual page created with latex2man on Thu Dec 8 12:01:30 2022
+.\" Manual page created with latex2man on Thu Jan 5 15:33:00 2023
.\" NOTE: This file is generated, DO NOT EDIT.
.de Vb
.ft CW
@@ -12,7 +12,7 @@
.fi
..
-.TH "UNW\\_BACKTRACE" "3" "08 December 2022" "Programming Library " "Programming Library "
+.TH "UNW\\_BACKTRACE" "3" "05 January 2023" "Programming Library " "Programming Library "
.SH NAME
unw_backtrace
\-\- return backtrace for the calling program
@@ -30,7 +30,8 @@ int size);
int
unw_backtrace2(void **buffer,
int size,
-unw_context_t *ctxt);
+unw_context_t *ctxt,
+int flag);
.br
.PP
#include <execinfo.h>
@@ -68,11 +69,16 @@ is linked against libunwind,
it may end up
calling unw_backtrace().
.PP
+In case you want to obtain the backtrace from a specific unw_context_t,
+you can call unw_backtrace2
+with that context passing 0
+for flag.
If the unw_context_t
is known to be a signal frame (i.e., from the third argument
in a sigaction handler on linux), unw_backtrace2
can be used to collect
-only the frames before the signal frame.
+only the frames before the signal frame passing the UNW_INIT_SIGNAL_FRAME
+flag.
.PP
.SH RETURN VALUE
diff --git a/doc/unw_backtrace.tex b/doc/unw_backtrace.tex
index 205aaea4..3e5152b6 100644
--- a/doc/unw_backtrace.tex
+++ b/doc/unw_backtrace.tex
@@ -13,7 +13,7 @@
\File{\#include $<$libunwind.h$>$}\\
\Type{int} \Func{unw\_backtrace}(\Type{void~**}\Var{buffer}, \Type{int}~\Var{size});\\
-\Type{int} \Func{unw\_backtrace2}(\Type{void~**}\Var{buffer}, \Type{int}~\Var{size}, \Type{unw_context_t~*}\Var{ctxt});\\
+\Type{int} \Func{unw\_backtrace2}(\Type{void~**}\Var{buffer}, \Type{int}~\Var{size}, \Type{unw_context_t~*}\Var{ctxt}, \Type{int}~\Var{flag});\\
\File{\#include $<$execinfo.h$>$}\\
@@ -33,9 +33,11 @@ aliases \Func{backtrace}() to \Func{unw\_backtrace}(), so when a program
calling \Func{backtrace}() is linked against \Prog{libunwind}, it may end up
calling \Func{unw\_backtrace}().
+In case you want to obtain the backtrace from a specific \Type{unw\_context\_t},
+you can call \Func{unw\_backtrace2} with that context passing \Const{0} for flag.
If the \Type{unw\_context_t} is known to be a signal frame (i.e., from the third argument
in a sigaction handler on linux), \Func{unw\_backtrace2} can be used to collect
-only the frames before the signal frame.
+only the frames before the signal frame passing the \Const{UNW\_INIT\_SIGNAL\_FRAME} flag.
\section{Return Value}
diff --git a/include/libunwind-common.h.in b/include/libunwind-common.h.in
index 3f04a1c4..7360a028 100644
--- a/include/libunwind-common.h.in
+++ b/include/libunwind-common.h.in
@@ -316,6 +316,6 @@ extern int unw_get_proc_name_by_ip (unw_addr_space_t, unw_word_t, char *,
size_t, unw_word_t *, void *);
extern const char *unw_strerror (int);
extern int unw_backtrace (void **, int);
-extern int unw_backtrace2 (void **, int, unw_context_t*);
+extern int unw_backtrace2 (void **, int, unw_context_t*, int);
extern unw_addr_space_t unw_local_addr_space;
diff --git a/src/mi/backtrace.c b/src/mi/backtrace.c
index 8fea3444..e532b79d 100644
--- a/src/mi/backtrace.c
+++ b/src/mi/backtrace.c
@@ -77,7 +77,7 @@ unw_backtrace (void **buffer, int size)
}
int
-unw_backtrace2 (void **buffer, int size, unw_context_t* uc2)
+unw_backtrace2 (void **buffer, int size, unw_context_t* uc2, int flag)
{
if (size == 0)
return 0;
@@ -89,7 +89,7 @@ unw_backtrace2 (void **buffer, int size, unw_context_t* uc2)
// need to copy, because the context will be modified by tdep_trace
unw_context_t uc = *(unw_context_t*)uc2;
- if (unlikely (unw_init_local2 (&cursor, &uc, UNW_INIT_SIGNAL_FRAME) < 0))
+ if (unlikely (unw_init_local2 (&cursor, &uc, flag) < 0))
return 0;
// get the first ip from the context
@@ -110,7 +110,7 @@ unw_backtrace2 (void **buffer, int size, unw_context_t* uc2)
// and add 1 to it (the one we retrieved above)
if (unlikely (tdep_trace (&cursor, buffer, &n) < 0))
{
- return slow_backtrace (buffer, remaining_size, &uc, UNW_INIT_SIGNAL_FRAME) + 1;
+ return slow_backtrace (buffer, remaining_size, &uc, flag) + 1;
}
return n + 1;
diff --git a/tests/Gtest-trace.c b/tests/Gtest-trace.c
index e0a5d64d..5f22f1fb 100644
--- a/tests/Gtest-trace.c
+++ b/tests/Gtest-trace.c
@@ -174,7 +174,7 @@ do_backtrace_with_context(void *context)
if (verbose)
printf ("\n\tvia unw_backtrace2():\n");
- m = unw_backtrace2 (addresses[1], 128, (unw_context_t*)context);
+ m = unw_backtrace2 (addresses[1], 128, (unw_context_t*)context, UNW_INIT_SIGNAL_FRAME);
if (verbose)
for (i = 0; i < m; ++i)