标签: backtrace

如何在C++中修复回溯行号错误

我想在跟踪程序捕获异常的一些信息时遇到问题.

我使用了以下功能:

extern "C" void log_backtrace()
{   
    // Dump the callstack
    int callstack[128];
    int  frames = backtrace((void**) callstack, 128);
    char** strs = backtrace_symbols((void**) callstack, frames);

    for (int i = 1; i < frames; ++i)
    {
        char functionSymbol[64*1024];
        char moduleName    [64*1024];
        int  offset        = 0;
        sscanf(strs[i], "%*d %s %*s %s %*s %d", &moduleName, &functionSymbol, &offset);
        int addr = callstack[i];
        int   validCppName;
        char* functionName = abi::__cxa_demangle(functionSymbol, NULL, 0,
                                             &validCppName);
        if (validCppName == 0)
            printf(   "\t%8.8x — %s + %d\t\t(%s)\n", addr, functionName, offset, …
Run Code Online (Sandbox Code Playgroud)

c++ macos backtrace debug-symbols

3
推荐指数
1
解决办法
2462
查看次数

我如何在我的 frameCount 函数中计算堆栈帧的数量?

我有由 frameCount 调用的汇编代码,需要返回 frameCount,但不确定如何检索(然后导航)前一帧的指针引用。

获取FP.s

  .globl getFP
getFP:
  movq %rbp, %rax
  ret
Run Code Online (Sandbox Code Playgroud)

帧数

int frameCount() {
  int count = 0;
  uint64_t fp = getFP();
  uint64_t *sp = &fp;
  
  // how do I get the pointer/offset to pointer to the previous stack frame from here?
  
  return count;
}
Run Code Online (Sandbox Code Playgroud)

更新:

我已经更新了 frameCount 函数以包含一个遍历堆栈帧链接列表的循环,但是在调用 frameCount 时出现分段错误。

主文件

#include <stdio.h>
#include <inttypes.h>
#include "framecount.c"

int main() {
  printf("Number of Frames: %d\n", frameCount());

  return(0);
}
Run Code Online (Sandbox Code Playgroud)

帧数

#include <stdio.h>
#include <inttypes.h>

uint64_t* getFP();

int frameCount() { …
Run Code Online (Sandbox Code Playgroud)

c assembly x86-64 backtrace stack-frame

3
推荐指数
1
解决办法
195
查看次数

奇怪的回溯 - 错误在哪里?

我正在用C++开发一个图像处理应用程序.我已经看到很多编译器错误和回溯,但这个对我来说是新的.

#0  0xb80c5430 in __kernel_vsyscall ()
#1  0xb7d1b6d0 in raise () from /lib/tls/i686/cmov/libc.so.6
#2  0xb7d1d098 in abort () from /lib/tls/i686/cmov/libc.so.6
#3  0xb7d5924d in ?? () from /lib/tls/i686/cmov/libc.so.6
#4  0xb7d62276 in ?? () from /lib/tls/i686/cmov/libc.so.6
#5  0xb7d639c5 in malloc () from /lib/tls/i686/cmov/libc.so.6
#6  0xb7f42f47 in operator new () from /usr/lib/libstdc++.so.6
#7  0x0805bd20 in Image<Color>::fft (this=0xb467640) at ../image_processing/image.cpp:545
Run Code Online (Sandbox Code Playgroud)

这里发生了什么事?操作员new崩溃了,好的.但为什么?这不是内存不足(它试图分配大约128Kb,128x64像素,每个都有两个浮点数).此外,它不会接缝,因为它是我自己的代码中的错误(构造函数不会被触及!).

上述行(#7)中的代码是:

Image<Complex> *result = new Image<Complex>(this->resX, resY); 
// this->resX = 128, resY = 64 (both int), Complex is a typedef for std::complex<float>
Run Code Online (Sandbox Code Playgroud)

几乎相同的实例化在我的代码中的其他地方起作用.如果我注释掉这部分代码,稍后会在类似的部分崩溃.我不明白,我也没有任何想法,如何调试它.有帮助吗? …

c++ gdb backtrace

2
推荐指数
1
解决办法
1329
查看次数

告诉如何调用函数

我看过debug_backtrace,但到目前为止它没有做我需要它做的事情.

我需要知道我正在调用的函数是"被叫"还是"回显".像这样:

function hello() {
    //blah blah
}

echo hello(); //echo-ed
hello(); //'called'
Run Code Online (Sandbox Code Playgroud)

但是,如果它被'echo-ed''调用',那么该函数会做不同的事情.

我该怎么办?

php debugging function backtrace

2
推荐指数
1
解决办法
150
查看次数

如何在C中手动迭代堆栈帧?

在处理应用程序中的信号时,我可以在调试器中正确看到backtrace。但是backtrace系统调用未正确显示堆栈帧.gdb存储堆栈帧的方式和backtrace系统调用如何转储它们之间有区别吗?

c linux gcc gdb backtrace

2
推荐指数
1
解决办法
955
查看次数

在“此时没有加载共享库”的情况下是否可以获得回溯?

当我给出“info share”命令并且我还在 gdb 上加载了符号文件和核心时,我收到“此时没有加载共享库”。但通常核心转储应该根据其相应的应用程序加载共享库。我已经指定了 solib-search-path,GDB 在搜索符号时将在其中查找共享库。

在“此时没有加载共享库”的情况下是否可以获得回溯?

gdb>info sharedlibrary
No shared libraries loaded at this time.
gdb> bt
#0  0xb6d1f232 in ?? ()
#1  0xb6d25ddc in ?? ()
#2  0xb6d25ddc in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
Run Code Online (Sandbox Code Playgroud)

非常感谢,提前。

gdb coredump shared-libraries backtrace debug-symbols

2
推荐指数
1
解决办法
5117
查看次数

从 backtrace_symbols 接收到的 c++ 符号不显示 g++ 中的函数

我正在尝试以编程方式在代码中打印回溯,使用 -g 编译所有源代码,并与其链接,并且我还添加了 fvisibility=internal。

但是当我调用符号列表时,我的所有代码如下所示:

模块()[0x424b69]

为什么函数名称没有出现在大括号中,我应该添加什么其他可能的标志?

谢谢。

c++ linux gcc g++ backtrace

2
推荐指数
1
解决办法
2155
查看次数

不使用 ebp 实现堆栈回溯

当编译器被明确告知不要使用 ebp 作为堆栈帧指针时,如何实现堆栈回溯?

c x86 assembly backtrace

2
推荐指数
1
解决办法
1019
查看次数

结合标志并清除Kotlin中的追溯轨迹

我正在使用kotlin开发android应用程序。在Android中,我们使用addFlags和setFlags设置标志并清除由“ |”分隔的回溯活动。如何在Kotlin中实现?我目前在Kotlin中使用以下代码:

startActivity(Intent(context, MyActivity::class.java)
            .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK))
Run Code Online (Sandbox Code Playgroud)

但这是行不通的。我也尝试过addFlags,它也不起作用。在这种情况下应该做什么?

android backtrace android-activity kotlin

2
推荐指数
1
解决办法
1745
查看次数

通过FFI获取和设置上一条错误消息的正确方法是什么?

我正在包装一个C API(dylib),它为最后一条错误消息公开了一个setter和getter API:

extern "C" {
    /// GetLastError is thread-safe
    pub fn GetLastError() -> *const ::std::os::raw::c_char;
    pub fn SetLastError(msg: *const ::std::os::raw::c_char);
}
Run Code Online (Sandbox Code Playgroud)

包裹它们的最简单方法如下

use std::error::Error;
use std::ffi::CStr;
use std::fmt::{self, Display, Formatter};
use std::os::raw::c_char;

pub struct MyError;

impl MyError {
    pub fn get_last() -> &'static str {
        unsafe {
            match CStr::from_ptr(c_api::GetLastError()).to_str() {
                Ok(s) => s,
                Err(_) => "Invalid UTF-8 message",
            }
        }
    }

    pub fn set_last(msg: &'static str) {
        unsafe {
            c_api::SetLastError(msg.as_ptr() as *const c_char);
        }
    }
}

impl Display for …
Run Code Online (Sandbox Code Playgroud)

runtime-error ffi backtrace rust

2
推荐指数
1
解决办法
95
查看次数