Skip to content

Commit 8d51b0f

Browse files
authored
[ET-VK] Show stack trace in Exception messages via boost if boost is available (pytorch#14967)
Title says it all! To enable easier debugging, use boost::stracktrace (if available) to record stack traces when throwing an Exception. This is available only when building for a host machine. Differential Revision: [D84262869](https://our.internmc.facebook.com/intern/diff/D84262869/)
1 parent fc512fa commit 8d51b0f

File tree

3 files changed

+40
-1
lines changed

3 files changed

+40
-1
lines changed

backends/vulkan/CMakeLists.txt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,9 @@ file(GLOB_RECURSE vulkan_runtime_utils_cpp ${RUNTIME_PATH}/utils/*.cpp)
111111

112112
# vulkan_backend
113113

114+
# Try to find boost to log stack traces when throwing exceptions
115+
find_package(Boost 1.89 COMPONENTS stacktrace_basic stacktrace_addr2line)
116+
114117
file(GLOB vulkan_backend_cpp ${RUNTIME_PATH}/*.cpp)
115118
list(APPEND vulkan_backend_cpp ${vulkan_graph_cpp})
116119
list(APPEND vulkan_backend_cpp ${vulkan_standard_shaders_cpp})
@@ -121,6 +124,14 @@ target_include_directories(
121124
vulkan_backend PRIVATE ${SCHEMA_INCLUDE_DIR} ${COMMON_INCLUDES}
122125
)
123126
target_link_libraries(vulkan_backend PRIVATE vulkan_schema executorch_core)
127+
# Optionally link boost for stacktraces if boost is available
128+
if(DEFINED Boost_STACKTRACE_BASIC_LIBRARY)
129+
target_link_libraries(
130+
vulkan_backend PRIVATE ${Boost_STACKTRACE_LIBRARY}
131+
${Boost_STACKTRACE_ADDR2LINE_LIBRARY}
132+
)
133+
list(APPEND VULKAN_CXX_FLAGS "-DETVK_BOOST_STACKTRACE_AVAILABLE")
134+
endif()
124135
target_compile_options(vulkan_backend PRIVATE ${VULKAN_CXX_FLAGS})
125136
# Link this library with --whole-archive due to dynamic backend registration
126137
executorch_target_link_options_shared_lib(vulkan_backend)

backends/vulkan/runtime/vk_api/Exception.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@
1010

1111
#include <sstream>
1212

13+
#ifdef ETVK_BOOST_STACKTRACE_AVAILABLE
14+
#ifndef _GNU_SOURCE
15+
#define _GNU_SOURCE
16+
#endif // _GNU_SOURCE
17+
#include <boost/stacktrace.hpp>
18+
#endif // ETVK_BOOST_STACKTRACE_AVAILABLE
19+
1320
namespace vkcompute {
1421
namespace vkapi {
1522

@@ -65,6 +72,11 @@ Error::Error(SourceLocation source_location, std::string msg)
6572
std::ostringstream oss;
6673
oss << "Exception raised from " << source_location_ << ": ";
6774
oss << msg_;
75+
#ifdef ETVK_BOOST_STACKTRACE_AVAILABLE
76+
oss << "\n";
77+
oss << "Stack trace:\n";
78+
oss << boost::stacktrace::stacktrace();
79+
#endif // ETVK_BOOST_STACKTRACE_AVAILABLE
6880
what_ = oss.str();
6981
}
7082

@@ -74,6 +86,11 @@ Error::Error(SourceLocation source_location, const char* cond, std::string msg)
7486
oss << "Exception raised from " << source_location_ << ": ";
7587
oss << "(" << cond << ") is false! ";
7688
oss << msg_;
89+
#ifdef ETVK_BOOST_STACKTRACE_AVAILABLE
90+
oss << "\n";
91+
oss << "Stack trace:\n";
92+
oss << boost::stacktrace::stacktrace();
93+
#endif // ETVK_BOOST_STACKTRACE_AVAILABLE
7794
what_ = oss.str();
7895
}
7996

backends/vulkan/targets.bzl

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ def get_vulkan_preprocessor_flags(no_volk, is_fbcode):
1919
default_flags = []
2020
android_flags = []
2121

22+
debug_mode = read_config("etvk", "debug", "0") == "1"
23+
2224
if not no_volk:
2325
for flags in [default_flags, android_flags]:
2426
flags.append("-DUSE_VULKAN_WRAPPER")
@@ -32,6 +34,10 @@ def get_vulkan_preprocessor_flags(no_volk, is_fbcode):
3234
if link_moltenvk:
3335
mac_flags = []
3436

37+
if debug_mode:
38+
mac_flags.append("-DETVK_BOOST_STACKTRACE_AVAILABLE")
39+
default_flags.append("-DETVK_BOOST_STACKTRACE_AVAILABLE")
40+
3541
VK_API_PREPROCESSOR_FLAGS += select({
3642
"DEFAULT": default_flags,
3743
"ovr_config//os:android": android_flags,
@@ -59,7 +65,6 @@ def get_vulkan_preprocessor_flags(no_volk, is_fbcode):
5965
if etvk_default_cache_path != "":
6066
VK_API_PREPROCESSOR_FLAGS += ["-DETVK_DEFAULT_CACHE_PATH={}".format(etvk_default_cache_path)]
6167

62-
debug_mode = read_config("etvk", "debug", "0") == "1"
6368
if debug_mode:
6469
VK_API_PREPROCESSOR_FLAGS += ["-DVULKAN_DEBUG"]
6570

@@ -136,6 +141,8 @@ def vulkan_spv_shader_lib(name, spv_filegroups, is_fbcode = False, no_volk = Fal
136141
)
137142

138143
def define_common_targets(is_fbcode = False):
144+
debug_mode = read_config("etvk", "debug", "0") == "1"
145+
139146
runtime.python_library(
140147
name = "gen_vulkan_spv_lib",
141148
srcs = [
@@ -200,6 +207,10 @@ def define_common_targets(is_fbcode = False):
200207
"//third-party/khronos:moltenVK_static"
201208
]
202209

210+
if debug_mode:
211+
mac_deps.append("fbsource//third-party/boost:boost")
212+
default_deps.append("fbsource//third-party/boost:boost")
213+
203214
VK_API_DEPS += select({
204215
"DEFAULT": default_deps,
205216
"ovr_config//os:android": android_deps,

0 commit comments

Comments
 (0)