summaryrefslogtreecommitdiffstats
path: root/Python/traceback.c
diff options
context:
space:
mode:
authorPablo Galindo Salgado <Pablogsal@gmail.com>2025-04-23 17:23:24 (GMT)
committerGitHub <noreply@github.com>2025-04-23 17:23:24 (GMT)
commit1007aab1330d3cf1a4021905ab424a1fd04747cc (patch)
tree253e05a4905111fb79e0a6455f281fbb908446fa /Python/traceback.c
parentc9bc458d307f9b8a97ffb3e19f630b23744fa96c (diff)
downloadcpython-1007aab1330d3cf1a4021905ab424a1fd04747cc.zip
cpython-1007aab1330d3cf1a4021905ab424a1fd04747cc.tar.gz
cpython-1007aab1330d3cf1a4021905ab424a1fd04747cc.tar.bz2
gh-127604: Allow faulthandler to dumpC stack on MacOS (#132841)
Diffstat (limited to 'Python/traceback.c')
-rw-r--r--Python/traceback.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/Python/traceback.c b/Python/traceback.c
index 7319382..56d94d6 100644
--- a/Python/traceback.c
+++ b/Python/traceback.c
@@ -18,11 +18,24 @@
#ifdef HAVE_UNISTD_H
# include <unistd.h> // lseek()
#endif
-#if defined(HAVE_EXECINFO_H) && defined(HAVE_DLFCN_H) && defined(HAVE_LINK_H)
+
+#if (defined(HAVE_EXECINFO_H) && defined(HAVE_DLFCN_H) && defined(HAVE_LINK_H))
+# define _PY_HAS_BACKTRACE_HEADERS 1
+#endif
+
+#if (defined(__APPLE__) && defined(HAVE_EXECINFO_H) && defined(HAVE_DLFCN_H))
+# define _PY_HAS_BACKTRACE_HEADERS 1
+#endif
+
+#ifdef _PY_HAS_BACKTRACE_HEADERS
# include <execinfo.h> // backtrace(), backtrace_symbols()
# include <dlfcn.h> // dladdr1()
-# include <link.h> // struct DL_info
-# if defined(HAVE_BACKTRACE) && defined(HAVE_BACKTRACE_SYMBOLS) && defined(HAVE_DLADDR1)
+#ifdef HAVE_LINK_H
+# include <link.h> // struct DL_info
+#endif
+# if defined(__APPLE__) && defined(HAVE_BACKTRACE) && defined(HAVE_BACKTRACE_SYMBOLS) && defined(HAVE_DLADDR)
+# define CAN_C_BACKTRACE
+# elif defined(HAVE_BACKTRACE) && defined(HAVE_BACKTRACE_SYMBOLS) && defined(HAVE_DLADDR1)
# define CAN_C_BACKTRACE
# endif
#endif
@@ -1193,6 +1206,9 @@ _Py_backtrace_symbols_fd(int fd, void *const *array, Py_ssize_t size)
VLA(int, status, size);
/* Fill in the information we can get from dladdr() */
for (Py_ssize_t i = 0; i < size; ++i) {
+#ifdef __APPLE__
+ status[i] = dladdr(array[i], &info[i]);
+#else
struct link_map *map;
status[i] = dladdr1(array[i], &info[i], (void **)&map, RTLD_DL_LINKMAP);
if (status[i] != 0
@@ -1204,6 +1220,7 @@ _Py_backtrace_symbols_fd(int fd, void *const *array, Py_ssize_t size)
something we want to subtract out */
info[i].dli_fbase = (void *) map->l_addr;
}
+#endif
}
for (Py_ssize_t i = 0; i < size; ++i) {
if (status[i] == 0