Skip to content

Commit 0141b53

Browse files
committed
[wpiutil] Use C++23 stacktrace library on Windows
This lets us remove the unmaintained StackWalker library and its hacky upstream_utils script. A Discord user also reported that StackWalker gives blank stacktraces: https://discord.com/channels/176186766946992128/368993897495527424/1261940029287301150 They reported an earlier version of this PR giving the following stacktrace instead: ``` D:\allwpilib\developerRobot\src\main\native\cpp\Robot.cpp(18): developerRobotCpp!Robot::RobotInit+0xB6 D:\allwpilib\wpilibc\src\main\native\cpp\TimedRobot.cpp(22): wpilibcd!frc::TimedRobot::StartCompetition+0x4F D:\allwpilib\wpilibc\src\main\native\include\frc\RobotBase.h(36): developerRobotCpp!frc::impl::RunRobot<Robot>+0xC8 D:\allwpilib\wpilibc\src\main\native\include\frc\RobotBase.h(106): developerRobotCpp!frc::StartRobot<Robot>+0x17E D:\allwpilib\developerRobot\src\main\native\cpp\Robot.cpp(60): developerRobotCpp!main+0xB D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl(79): developerRobotCpp!invoke_main+0x39 D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl(288): developerRobotCpp!__scrt_common_main_seh+0x132 D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl(331): developerRobotCpp!__scrt_common_main+0xE D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_main.cpp(17): developerRobotCpp!mainCRTStartup+0xE KERNEL32!BaseThreadInitThunk+0x1D ntdll!RtlUserThreadStart+0x28 ```
1 parent e9efb05 commit 0141b53

File tree

18 files changed

+71
-1980
lines changed

18 files changed

+71
-1980
lines changed

.github/workflows/upstream-utils.yml

-5
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,6 @@ jobs:
7070
cd upstream_utils
7171
./mpack.py clone
7272
./mpack.py copy-upstream-to-thirdparty
73-
- name: Run stack_walker.py
74-
run: |
75-
cd upstream_utils
76-
./stack_walker.py clone
77-
./stack_walker.py copy-upstream-to-thirdparty
7873
- name: Run memory.py
7974
run: |
8075
cd upstream_utils

apriltag/CMakeLists.txt

+2-1
Original file line numberDiff line numberDiff line change
@@ -120,11 +120,11 @@ add_library(
120120
set_target_properties(apriltag PROPERTIES DEBUG_POSTFIX "d")
121121

122122
set_property(TARGET apriltag PROPERTY FOLDER "libraries")
123-
target_compile_features(apriltag PUBLIC cxx_std_20)
124123
wpilib_target_warnings(apriltag)
125124
# disable warnings that apriltaglib can't handle
126125
if(MSVC)
127126
target_compile_options(apriltag PRIVATE /wd4018 /wd4005 /wd4996)
127+
target_compile_features(apriltag PUBLIC cxx_std_23)
128128
else()
129129
target_compile_options(
130130
apriltag
@@ -134,6 +134,7 @@ else()
134134
-Wno-type-limits
135135
-Wno-format-nonliteral
136136
)
137+
target_compile_features(apriltag PUBLIC cxx_std_20)
137138
endif()
138139

139140
target_link_libraries(apriltag wpimath)

fieldImages/CMakeLists.txt

+3-1
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,11 @@ add_library(fieldImages src/main/native/cpp/fields.cpp ${field_images_resources_
4141
set_target_properties(fieldImages PROPERTIES DEBUG_POSTFIX "d")
4242

4343
set_property(TARGET fieldImages PROPERTY FOLDER "libraries")
44-
target_compile_features(fieldImages PUBLIC cxx_std_20)
4544
if(MSVC)
4645
target_compile_options(fieldImages PUBLIC /bigobj)
46+
target_compile_features(fieldImages PUBLIC cxx_std_23)
47+
else()
48+
target_compile_features(fieldImages PUBLIC cxx_std_20)
4749
endif()
4850
wpilib_target_warnings(fieldImages)
4951

imgui/CMakeLists.txt

+5-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,11 @@ target_include_directories(
105105
)
106106

107107
set_property(TARGET imgui PROPERTY POSITION_INDEPENDENT_CODE ON)
108-
target_compile_features(imgui PUBLIC cxx_std_20)
108+
if(MSVC)
109+
target_compile_features(imgui PUBLIC cxx_std_23)
110+
else()
111+
target_compile_features(imgui PUBLIC cxx_std_20)
112+
endif()
109113

110114
install(TARGETS imgui EXPORT imgui)
111115
export(TARGETS imgui FILE imgui.cmake NAMESPACE imgui::)

ntcore/CMakeLists.txt

+5-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,11 @@ target_include_directories(
2323
$<INSTALL_INTERFACE:${include_dest}/ntcore>
2424
)
2525
wpilib_target_warnings(ntcore)
26-
target_compile_features(ntcore PUBLIC cxx_std_20)
26+
if(MSVC)
27+
target_compile_features(ntcore PUBLIC cxx_std_23)
28+
else()
29+
target_compile_features(ntcore PUBLIC cxx_std_20)
30+
endif()
2731
target_link_libraries(ntcore PUBLIC wpinet wpiutil)
2832

2933
set_property(TARGET ntcore PROPERTY FOLDER "libraries")

romiVendordep/CMakeLists.txt

+5-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,11 @@ add_library(romiVendordep ${romiVendordep_native_src})
5252
set_target_properties(romiVendordep PROPERTIES DEBUG_POSTFIX "d")
5353
set_property(TARGET romiVendordep PROPERTY FOLDER "libraries")
5454

55-
target_compile_features(romiVendordep PUBLIC cxx_std_20)
55+
if(MSVC)
56+
target_compile_features(romiVendordep PUBLIC cxx_std_23)
57+
else()
58+
target_compile_features(romiVendordep PUBLIC cxx_std_20)
59+
endif()
5660
wpilib_target_warnings(romiVendordep)
5761
target_link_libraries(romiVendordep wpilibc)
5862

shared/config.gradle

+7
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,13 @@ nativeUtils.platformConfigs.named(nativeUtils.wpi.platforms.windowsx64).configur
4545
it.cppCompiler.args.add("/D_DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR")
4646
}
4747

48+
// Use C++23 on Windows
49+
nativeUtils.platformConfigs.each {
50+
if (it.name.contains('windows')) {
51+
it.cppCompiler.args.add("/std:c++latest")
52+
}
53+
}
54+
4855
nativeUtils.platformConfigs.linuxathena.linker.args.add("-Wl,--fatal-warnings")
4956

5057
model {

upstream_utils/stack_walker.py

-76
This file was deleted.

upstream_utils/stack_walker_patches/0001-Add-advapi-pragma.patch

-21
This file was deleted.

wpilibNewCommands/CMakeLists.txt

+5-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,11 @@ add_library(wpilibNewCommands ${wpilibNewCommands_native_src})
6060
set_target_properties(wpilibNewCommands PROPERTIES DEBUG_POSTFIX "d")
6161
set_property(TARGET wpilibNewCommands PROPERTY FOLDER "libraries")
6262

63-
target_compile_features(wpilibNewCommands PUBLIC cxx_std_20)
63+
if(MSVC)
64+
target_compile_features(wpilibNewCommands PUBLIC cxx_std_23)
65+
else()
66+
target_compile_features(wpilibNewCommands PUBLIC cxx_std_20)
67+
endif()
6468
wpilib_target_warnings(wpilibNewCommands)
6569
target_link_libraries(wpilibNewCommands wpilibc)
6670

wpimath/CMakeLists.txt

+3-1
Original file line numberDiff line numberDiff line change
@@ -136,9 +136,11 @@ set_target_properties(wpimath PROPERTIES DEBUG_POSTFIX "d")
136136
set_property(TARGET wpimath PROPERTY FOLDER "libraries")
137137
target_compile_definitions(wpimath PRIVATE WPILIB_EXPORTS SLEIPNIR_EXPORTS)
138138

139-
target_compile_features(wpimath PUBLIC cxx_std_20)
140139
if(MSVC)
141140
target_compile_options(wpimath PUBLIC /utf-8 /bigobj)
141+
target_compile_features(wpimath PUBLIC cxx_std_23)
142+
else()
143+
target_compile_features(wpimath PUBLIC cxx_std_20)
142144
endif()
143145
wpilib_target_warnings(wpimath)
144146
target_link_libraries(wpimath wpiutil)

wpinet/CMakeLists.txt

+5-1
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,11 @@ set_target_properties(wpinet PROPERTIES DEBUG_POSTFIX "d")
126126

127127
set_property(TARGET wpinet PROPERTY FOLDER "libraries")
128128

129-
target_compile_features(wpinet PUBLIC cxx_std_20)
129+
if(MSVC)
130+
target_compile_features(wpinet PUBLIC cxx_std_23)
131+
else()
132+
target_compile_features(wpinet PUBLIC cxx_std_20)
133+
endif()
130134
wpilib_target_warnings(wpinet)
131135
target_link_libraries(wpinet PUBLIC wpiutil)
132136

wpiutil/CMakeLists.txt

+3-1
Original file line numberDiff line numberDiff line change
@@ -134,13 +134,15 @@ set_target_properties(wpiutil PROPERTIES DEBUG_POSTFIX "d")
134134

135135
set_property(TARGET wpiutil PROPERTY FOLDER "libraries")
136136

137-
target_compile_features(wpiutil PUBLIC cxx_std_20)
138137
if(MSVC)
139138
target_compile_options(
140139
wpiutil
141140
PUBLIC /permissive- /Zc:preprocessor /Zc:__cplusplus /Zc:throwingNew /MP /bigobj /utf-8
142141
)
143142
target_compile_definitions(wpiutil PRIVATE -D_CRT_SECURE_NO_WARNINGS)
143+
target_compile_features(wpiutil PUBLIC cxx_std_23)
144+
else()
145+
target_compile_features(wpiutil PUBLIC cxx_std_20)
144146
endif()
145147
wpilib_target_warnings(wpiutil)
146148
target_link_libraries(wpiutil protobuf::libprotobuf Threads::Threads ${CMAKE_DL_LIBS})

wpiutil/src/main/native/unix/StackTrace.cpp wpiutil/src/main/native/cpp/StackTrace.cpp

+23-6
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@
44

55
#include "wpi/StackTrace.h"
66

7+
#ifdef __cpp_lib_stacktrace
8+
#include <stacktrace>
9+
#elif !defined(_WIN32)
710
#include <execinfo.h>
11+
#endif
812

913
#include "wpi/Demangle.h"
1014
#include "wpi/SmallString.h"
@@ -14,26 +18,39 @@
1418
namespace wpi {
1519

1620
std::string GetStackTraceDefault(int offset) {
21+
wpi::SmallString<1024> buf;
22+
wpi::raw_svector_ostream trace(buf);
23+
24+
#ifdef __cpp_lib_stacktrace
25+
auto stackTrace = std::stacktrace::current();
26+
27+
for (size_t i = offset; i < stackTrace.size(); ++i) {
28+
// Only print recursive functions once in a row
29+
if (i == 0 || stackTrace[i] != stackTrace[i - 1]) {
30+
trace << "\tat " << std::to_string(stackTrace[i]) << '\n';
31+
}
32+
}
33+
#elif !defined(_WIN32)
1734
void* stackTrace[128];
1835
int stackSize = backtrace(stackTrace, 128);
1936
char** mangledSymbols = backtrace_symbols(stackTrace, stackSize);
20-
wpi::SmallString<1024> buf;
21-
wpi::raw_svector_ostream trace(buf);
2237

23-
for (int i = offset; i < stackSize; i++) {
24-
// Only print recursive functions once in a row.
38+
for (int i = offset; i < stackSize; ++i) {
39+
// Only print recursive functions once in a row
2540
if (i == 0 || stackTrace[i] != stackTrace[i - 1]) {
26-
// extract just function name from "pathToExe(functionName+offset)"
41+
// Extract just function name from "pathToExe(functionName+offset)"
2742
std::string_view sym = split(mangledSymbols[i], '(').second;
2843
std::string_view offset;
2944
std::tie(sym, offset) = split(sym, '+');
3045
std::string_view addr;
3146
std::tie(offset, addr) = split(offset, ')');
32-
trace << "\tat " << Demangle(sym) << " + " << offset << addr << "\n";
47+
48+
trace << "\tat " << Demangle(sym) << " + " << offset << addr << '\n';
3349
}
3450
}
3551

3652
std::free(mangledSymbols);
53+
#endif
3754

3855
return std::string{trace.str()};
3956
}

wpiutil/src/main/native/windows/StackTrace.cpp

-40
This file was deleted.

0 commit comments

Comments
 (0)