Copyright (c) 2013-2018 brinkqiang ([email protected])
| Linux | Mac | Windows |
|---|---|---|
dmbacktrace
#include "dmbacktrace.h"
#include <iostream>
#include <string>
void test2()
{
dmbacktracePtr module(dmbacktraceGetModule());
if (module) {
std::cout << "--- Stack Trace from Main Thread ---" << std::endl;
std::cout << module->GetBackTrace(0);
std::cout << "------------------------------------" << std::endl;
}
}
void test()
{
test2();
}
int main( int argc, char* argv[] ) {
test();
return 0;
}-
Function Inlining: In Release builds, simple functions are often inlined into their callers and will not appear in the stack trace. This can make the call stack look shorter or incomplete.
-
For Debugging: To get the most accurate stack traces, compile in Debug mode (e.g.,
g++ -g -O0). -
For Release (Linux): To get meaningful stack traces from a Release build on Linux, you must use the following flags:
- Compile with
-gto include symbol information. - Link with
-rdynamicto make symbols available at runtime.
# Recommended release build command for Linux g++ -O2 -g -rdynamic ... - Compile with
-
函数内联 (Function Inlining): 在 Release 模式下,简单的函数会被编译器内联,导致它们不会出现在最终的调用堆栈中。这会让调用链看起来比实际的短。
-
用于调试: 如需最完整的堆栈信息,请在 Debug 模式下编译 (例如
g++ -g -O0)。 -
用于 Release (Linux): 如果希望在 Release 版本中也能获取有意义的堆栈,必须使用以下编译和链接选项:
- 编译时使用
-g加入符号信息。 - 链接时使用
-rdynamic使符号在运行时可见。
# 推荐的 Linux Release 构建命令 g++ -O2 -g -rdynamic ... - 编译时使用
win
dmbacktrace\src\libdmbacktrace\libdmbacktrace_impl.cpp (116): DmbacktraceImpl::GetBackTrace
dmbacktrace\test\dmbacktrace_easytest\dmbacktrace_easytest.cpp (9): test2
dmbacktrace\test\dmbacktrace_easytest\dmbacktrace_easytest.cpp (16): test
dmbacktrace\test\dmbacktrace_easytest\dmbacktrace_easytest.cpp (22): main
D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl (79): invoke_main
D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl (288): __scrt_common_main_seh
D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl (331): __scrt_common_main
D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_main.cpp (17): mainCRTStartup
00007FF80F277374 (KERNEL32): (filename not available): BaseThreadInitThunk
00007FF81113CC91 (ntdll): (filename not available): RtlUserThreadStart
linux(centos)
--- Stack Trace from Main Thread ---
[00] ./dmbacktrace_easytest(test2()+0x9a) [0x5591b3686a03]
[01] ./dmbacktrace_easytest(test()+0xd) [0x5591b3686ab8]
[02] ./dmbacktrace_easytest(main+0x18) [0x5591b3686ad3]
[03] /lib/x86_64-linux-gnu/libc.so.6(+0x29d90) [0x7f9540342d90]
[04] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0x80) [0x7f9540342e40]
[05] ./dmbacktrace_easytest(_start+0x25) [0x5591b36868a5]