我想在跟踪程序捕获异常的一些信息时遇到问题.
我使用了以下功能:
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) 我有由 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++开发一个图像处理应用程序.我已经看到很多编译器错误和回溯,但这个对我来说是新的.
#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)
几乎相同的实例化在我的代码中的其他地方起作用.如果我注释掉这部分代码,稍后会在类似的部分崩溃.我不明白,我也没有任何想法,如何调试它.有帮助吗? …
我看过debug_backtrace,但到目前为止它没有做我需要它做的事情.
我需要知道我正在调用的函数是"被叫"还是"回显".像这样:
function hello() {
//blah blah
}
echo hello(); //echo-ed
hello(); //'called'
Run Code Online (Sandbox Code Playgroud)
但是,如果它被'echo-ed''调用',那么该函数会做不同的事情.
我该怎么办?
在处理应用程序中的信号时,我可以在调试器中正确看到backtrace。但是backtrace系统调用未正确显示堆栈帧.gdb存储堆栈帧的方式和backtrace系统调用如何转储它们之间有区别吗?
当我给出“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)
非常感谢,提前。
我正在尝试以编程方式在代码中打印回溯,使用 -g 编译所有源代码,并与其链接,并且我还添加了 fvisibility=internal。
但是当我调用符号列表时,我的所有代码如下所示:
模块()[0x424b69]
为什么函数名称没有出现在大括号中,我应该添加什么其他可能的标志?
谢谢。
我正在使用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,它也不起作用。在这种情况下应该做什么?
我正在包装一个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)