如何在C++中通过回溯获得正确的代码行?
How to get the correct line of code with backtrace in C++?
我采用了这段代码并将其修改为如下所示:
std::string Backtrace(int skip = 1)
{
void *callstack[128];
const int nMaxFrames = sizeof(callstack) / sizeof(callstack[0]);
char buf[1024];
int nFrames = backtrace(callstack, nMaxFrames);
char **symbols = backtrace_symbols(callstack, nFrames);
string message = "";
for (int i = skip; i < nFrames; i++) {
Dl_info info;
if (dladdr(callstack[i], &info)) {
char *demangled = nullptr;
int status;
demangled = abi::__cxa_demangle(info.dli_sname, NULL, 0, &status);
if(demangled != nullptr)
message += string(demangled) + ": " +
to_string((char *)callstack[i] - (char *)info.dli_saddr) + "n";
free(demangled);
}
}
free(symbols);
if (nFrames == nMaxFrames)
message += "[truncated]n";
return message;
}
这应该打印我当前程序的堆栈跟踪,以确定出现问题的地方,而无需每次程序崩溃时都打开 gdb。
当我运行此代码(在保证触发问题的状态下(时,我得到以下堆栈跟踪:
DebugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT, unsigned int, VkDebugUtilsMessengerCallbackDataEXT const*, void*): 146
vk::DispatchLoaderStatic::vkQueueSubmit(VkQueue_T*, unsigned int, VkSubmitInfo const*, VkFence_T*) const: 50
Display::UpdateFrame(): 1088
RenderingPipeline::RenderFrame(vk::Buffer&, vk::Buffer&, Image&, unsigned int): 63
RenderHandler::RenderHandler(Window*, HardwareInterface*, Display*, Memory*): 784
我的目标是尝试打印尽可能多的相关信息。(文件、函数、行(。现在,我认为指令: 我从原始脚本复制(char *)callstack[i] - (char *)info.dli_saddr)
,会让我得到调用代码的行,但例如定义Display::UpdateFrame()
的文件;甚至有 1000 行,所以这个数字不是原始文件中调用代码的编号。
有没有办法像 GDB 一样使用堆栈跟踪获取此信息?
即,如果该函数在源代码中被调用
File: Display.hpp
Function: Display::UpdateFrame()
Line: 227
是否可以在运行时使用堆栈跟踪检索该信息?
backtrace(( 返回相对于某些 ELF 部分开头的字节偏移量。为了获取行号和函数名称,您需要使用一个库,该库可以读取程序的调试信息,然后找出给定偏移量对应于哪个源文件/行号/函数。
下面是一个如何使用libbfd(假设你在Linux上(执行此操作的示例(由我编写(:
https://github.com/CarloWood/libmemleak/blob/master/src/addr2line.c
相关文章:
- 当回溯以零开始时,如何调试崩溃
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 如何在C++中通过回溯获得正确的代码行?
- 使用gdb回溯调试MPI代码
- 回溯c++代码gdb中的指针
- 我的回溯代码中的错误 - 过桥
- 回溯在代码中是如何工作的
- (iphone) 奇怪的EXC_BAD_ACCESS,在回溯中的 A::A(),但代码指向 B::B()
- 使用回溯的代码骑士之旅未显示任何输出