Skip to content

Commit 12b2607

Browse files
committed
auto merge of #12602 : alexcrichton/rust/backtrace, r=brson
Whenever a failure happens, if a program is run with `RUST_LOG=std::rt::backtrace` a backtrace will be printed to the task's stderr handle. Stack traces are uncondtionally printed on double-failure and rtabort!(). This ended up having a nontrivial implementation, and here's some highlights of it: * We're bundling libbacktrace for everything but OSX and Windows * We use libgcc_s and its libunwind apis to get a backtrace of instruction pointers * On OSX we use dladdr() to go from an instruction pointer to a symbol * On unix that isn't OSX, we use libbacktrace to get symbols * Windows, as usual, has an entirely separate implementation Lots more fun details and comments can be found in the source itself. Closes #10128
2 parents 6cbba7c + 829df69 commit 12b2607

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+39814
-101
lines changed

mk/crates.mk

+1-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ HOST_CRATES := syntax rustc rustdoc fourcc hexfloat
5555
CRATES := $(TARGET_CRATES) $(HOST_CRATES)
5656
TOOLS := compiletest rustdoc rustc
5757

58-
DEPS_std := native:rustrt native:compiler-rt
58+
DEPS_std := native:rustrt native:compiler-rt native:backtrace
5959
DEPS_extra := std term sync serialize getopts collections time rand
6060
DEPS_green := std rand native:context_switch
6161
DEPS_rustuv := std native:uv native:uv_support

mk/rt.mk

+67
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,73 @@ $$(COMPRT_LIB_$(1)): $$(COMPRT_DEPS) $$(MKFILE_DEPS)
249249
triple-runtime
250250
$$(Q)cp $$(COMPRT_BUILD_DIR_$(1))/triple/runtime/libcompiler_rt.a $$(COMPRT_LIB_$(1))
251251

252+
################################################################################
253+
# libbacktrace
254+
#
255+
# We use libbacktrace on linux to get symbols in backtraces, but only on linux.
256+
# Elsewhere we use other system utilities, so this library is only built on
257+
# linux.
258+
################################################################################
259+
260+
BACKTRACE_NAME_$(1) := $$(call CFG_STATIC_LIB_NAME_$(1),backtrace)
261+
BACKTRACE_LIB_$(1) := $$(RT_OUTPUT_DIR_$(1))/$$(BACKTRACE_NAME_$(1))
262+
BACKTRACE_BUILD_DIR_$(1) := $$(RT_OUTPUT_DIR_$(1))/libbacktrace
263+
264+
ifeq ($$(findstring darwin,$$(OSTYPE_$(1))),darwin)
265+
266+
# We don't use this on platforms that aren't linux-based, so just make the file
267+
# available, the compilation of libstd won't actually build it.
268+
$$(BACKTRACE_LIB_$(1)):
269+
touch $$@
270+
271+
else
272+
ifeq ($$(CFG_WINDOWSY_$(1)),1)
273+
$$(BACKTRACE_LIB_$(1)):
274+
touch $$@
275+
else
276+
277+
ifdef CFG_ENABLE_FAST_MAKE
278+
BACKTRACE_DEPS := $(S)/.gitmodules
279+
else
280+
BACKTRACE_DEPS := $(wildcard $(S)src/libbacktrace/*)
281+
endif
282+
283+
# We need to export CFLAGS because otherwise it doesn't pick up cross compile
284+
# builds. If libbacktrace doesn't realize this, it will attempt to read 64-bit
285+
# elf headers when compiled for a 32-bit system, yielding blank backtraces.
286+
#
287+
# This also removes the -Werror flag specifically to prevent errors during
288+
# configuration.
289+
#
290+
# Down below you'll also see echos into the config.h generated by the
291+
# ./configure script. This is done to force libbacktrace to *not* use the
292+
# atomic/sync functionality because it pulls in unnecessary dependencies and we
293+
# never use it anyway.
294+
$$(BACKTRACE_BUILD_DIR_$(1))/Makefile: \
295+
export CFLAGS:=$$(CFG_GCCISH_CFLAGS_$(1):-Werror=) \
296+
-fno-stack-protector
297+
$$(BACKTRACE_BUILD_DIR_$(1))/Makefile: export CC:=$$(CC_$(1))
298+
$$(BACKTRACE_BUILD_DIR_$(1))/Makefile: export AR:=$$(AR_$(1))
299+
$$(BACKTRACE_BUILD_DIR_$(1))/Makefile: export RANLIB:=$$(AR_$(1)) s
300+
$$(BACKTRACE_BUILD_DIR_$(1))/Makefile: $$(BACKTRACE_DEPS) $$(MKFILE_DEPS)
301+
$$(Q)rm -rf $$(BACKTRACE_BUILD_DIR_$(1))
302+
$$(Q)mkdir -p $$(BACKTRACE_BUILD_DIR_$(1))
303+
$$(Q)(cd $$(BACKTRACE_BUILD_DIR_$(1)) && \
304+
$(S)src/libbacktrace/configure --target=$(1) --host=$(CFG_BUILD))
305+
$$(Q)echo '#undef HAVE_ATOMIC_FUNCTIONS' >> \
306+
$$(BACKTRACE_BUILD_DIR_$(1))/config.h
307+
$$(Q)echo '#undef HAVE_SYNC_FUNCTIONS' >> \
308+
$$(BACKTRACE_BUILD_DIR_$(1))/config.h
309+
310+
$$(BACKTRACE_LIB_$(1)): $$(BACKTRACE_BUILD_DIR_$(1))/Makefile $$(MKFILE_DEPS)
311+
@$$(call E, make: libbacktrace)
312+
$$(Q)$$(MAKE) -C $$(BACKTRACE_BUILD_DIR_$(1)) \
313+
INCDIR=$(S)src/libbacktrace
314+
$$(Q)cp $$(BACKTRACE_BUILD_DIR_$(1))/.libs/libbacktrace.a $$@
315+
316+
endif # endif for windowsy
317+
endif # endif for darwin
318+
252319
endef
253320

254321
# Instantiate template for all stages/targets

mk/tests.mk

+2
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@ tidy:
240240
| grep '^$(S)src/libuv' -v \
241241
| grep '^$(S)src/llvm' -v \
242242
| grep '^$(S)src/gyp' -v \
243+
| grep '^$(S)src/libbacktrace' -v \
243244
| xargs -n 10 $(CFG_PYTHON) $(S)src/etc/tidy.py
244245
$(Q)find $(S)src/etc -name '*.py' \
245246
| xargs -n 10 $(CFG_PYTHON) $(S)src/etc/tidy.py
@@ -266,6 +267,7 @@ tidy:
266267
| grep '^$(S)src/etc' -v \
267268
| grep '^$(S)src/doc' -v \
268269
| grep '^$(S)src/compiler-rt' -v \
270+
| grep '^$(S)src/libbacktrace' -v \
269271
| xargs $(CFG_PYTHON) $(S)src/etc/check-binaries.py
270272

271273
endif

0 commit comments

Comments
 (0)