草庐IT

c - ARM 平台上没有来自 SIGABRT 信号的回溯?

我在信号处理程序中使用“backtrce()”和“backtrace_symbols_fd()”函数来生成用于调试的回溯(GDB不可用)。它们在x86桌面(Ubuntu)上运行良好,但在目标设备(基于ARM)上,Abort信号的回溯(由于double-free错误)仅显示三个帧:信号处理程序还有两个来自libc,这对调试我们的代码没有用!SEGV上的回溯(例如使用错误的指针)确实会产生良好的回溯。为什么我不能在ARM上获得有用的ABRT信号回溯?[为清楚起见编辑了问题]这是一个演示问题的简单测试程序:#include#include#include#include#include//S

php - 如何将 PHP 回溯保存到错误日志中?

我现在正在使用这个:error_log(serialize(debug_backtrace()));但我每次都必须反序列化它。有没有更好的方法来存储回溯? 最佳答案 这应该生成一个可读的字符串:error_log(print_r(debug_backtrace(),true));此外,debug_print_backtrace()将回溯跟踪打印为字符串,并且可以使用常规输出缓冲函数捕获其输出:ob_start();debug_print_backtrace();error_log(ob_get_clean());

php - 如何让 PHP 在错误时产生回溯?

尝试使用其默认的仅限当前行的错误消息来调试PHP是可怕的。产生错误时如何让PHP产生回溯(堆栈跟踪)? 最佳答案 我用于安装产生回溯的错误处理程序的脚本:').''.(isset($item['line'])?$item['line']:'').'calling'.$item['function'].'()'."\n";}else{echo''."\n";echo'Backtracefrom'.$type.'\''.$errstr.'\'at'.$errfile.''.$errline.':'."\n";echo''."\n";fo

c++ - GDB 回溯消息 "0x0000000000000000 in ?? ()"是什么意思?

当它给出带有以下输出的回溯时是什么意思?#00x00000008009c991cinpthread_testcancel()from/lib/libpthread.so.2#10x00000008009b8120insigaction()from/lib/libpthread.so.2#20x00000008009c211ainpthread_mutexattr_init()from/lib/libpthread.so.2#30x0000000000000000in??()程序因标准信号11、段错误而崩溃。我的应用程序是一个在FreeBSD6.3上运行的多线程FastCGIC++程序,

c++ - 从 catch block 中获取回溯

我正在使用backtrace从引发异常的位置获取信息。在我的异常的构造函数中,我将回溯存储在std::string中,在这种类型的异常的catchblock中,我正在打印这个回溯。但我想知道,是否有可能以某种方式在catchblock中为其他异常类型获得相同的回溯? 最佳答案 您可能对正在开发的Boost库感兴趣:PortableBacktrace.示例:#include#includeintfoo(){throwboost::runtime_error("MyError");return10;}intbar(){returnfoo

c++ - 捕获异常时可以使用 gdb 进行回溯吗?

我刚刚开始使用c++异常,并且想把它弄好。我的想法是在捕获异常时生成某种回溯信息。最初我的想法类似于Call-stackforexceptionsinC++但最终发现这不太好。我也看过HowtogenerateastacktracewhenmygccC++appcrashes但不想给我当前的项目增加更多的复杂性。因为,我只需要在Debug模式下进行回溯,我希望我可以为此目的使用gdb。我的策略是在catchblock中插入断点,然后向上遍历调用堆栈以准确查明首先引发异常的原因(或导致异常的原因)?不幸的是,我似乎无法做到这一点,因为当gdb到达断点时,它会清除调用堆栈,我只能看到mai

c++ - 没有用户输入的gdb回溯?

我想知道是否可以通过GDB启动应用程序,在SegFault上将回溯写入文件(稍后查看),然后在没有任何用户输入的情况下退出GDB。在从非交互式session启动操作系统时,我正在无限循环中从shell脚本运行应用程序(因此,如果它崩溃,它会重新加载)。该应用程序以不可重现的方式崩溃,因此我需要从崩溃中回溯以调试问题。理想情况下,我只需修改shell脚本以包含GDB调试+回溯功能,并保留崩溃后应用程序的自动重启。这可能吗? 最佳答案 感谢AdityaKumar;可接受的解决方案:gdb-batch-ex"run"-ex"bt"${my

javascript - 如何为 NodeJS 中的自定义错误类获取正确的回溯?

我对在JavaScript中创建自定义Error类的“正确”方式的理解是这样的:functionMyError(message){this.name="MyError";this.message=message||"DefaultMessage";}MyError.prototype=newError();MyError.prototype.constructor=MyError;(来自https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error的代码片段。)使用NodeJS,如果我尝试检查此类错误

python - 回溯 : AttributeError:addinfourl instance has no attribute '__exit__'

fromurllibimporturlopenwithurlopen('https://www.python.org')asstory:story_words=[]forlineinstory:line_words=line.split()forwordsinline_words:story_words.append(word)错误信息:Traceback(mostrecentcalllast):File"",line1,inAttributeError:addinfourlinstancehasnoattribute'__exit__'我不明白上面的代码有什么问题以及如何解决?系统信

python - 引发异常时如何修改 Python 回溯对象?

我正在开发一个Python库,第三方开发人员使用它来为我们的核心应用程序编写扩展。我想知道是否可以在引发异常时修改回溯,所以最后一个堆栈帧是开发人员代码中对库函数的调用,而不是库中引发异常的行。堆栈底部还有一些框架,其中包含对首次加载代码时使用的函数的引用,我也希望将其删除。提前感谢您的任何建议! 最佳答案 您可以通过使用回溯的tb_next元素来轻松移除回溯的顶部:except:ei=sys.exc_info()raiseei[0],ei[1],ei[2].tb_nexttb_next是一个只读属性,所以我不知道如何从底部删除东西