问题标签 [stack-unwinding]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1293 浏览

windbg - 我可以在 WinDbg 中禁用“无法读取动态函数表条目”消息吗?

我正在使用一个在运行时生成大量代码的程序,并且似乎不会为它生成任何展开数据。(我没有这个程序的源代码;我正在为它写一个插件。)

当程序挂起时,我使用 WinDbg 闯入它,并尝试使用~* k. 除了堆栈跟踪,我还获得了页面和页面(以及页面等等)的消息

这需要很长时间才能打印 - 超过一分钟 - 而且它会溢出滚动缓冲区,所以我丢失了大部分输出。

我现在已经通过十六进制编辑包含此消息的 DLL 来解决这个问题,但是……说真的。有没有官方的方法来摆脱这个消息?

我已准备好从问题线程中获取糟糕的堆栈跟踪。

0 投票
3 回答
2504 浏览

rust - Rust 如何知道在堆栈展开期间是否运行析构函数?

的文档mem::uninitialized指出了为什么使用该函数是危险/不安全的:调用drop未初始化的内存是未定义的行为。

所以我相信这段代码应该是未定义的:

但是,我编写了这段代码,它在安全的 Rust 中工作,并且似乎没有受到未定义行为的影响:

它似乎总是执行正确的析构函数,而忽略另一个。如果我尝试使用aor b(比如a.disp()代替t.disp()),它会正确错误地指出我可能正在使用未初始化的内存。令我惊讶的是,当panic国王时,它总是运行正确的析构函数(打印预期的字符串),无论值i是什么。

这是怎么发生的?如果运行时可以确定要运行哪个析构函数,是否应该Drop从上面链接的文档中删除强制需要为已实现的类型初始化内存的部分mem::uninitialized()

0 投票
2 回答
968 浏览

java - 通过树递归搜索而不传递对象

我正在尝试在非二叉树中搜索节点,而实际上没有将节点传递给搜索方法。

每个节点都有一个name变量。该findChild()方法采用一个名称,并在调用它的树中搜索以找到具有该名称的节点。

为了进行递归搜索,我调用findChild()子节点而不是将子节点传递给findChild()方法。打印语句显示该方法通过树向下传递,但result随着堆栈展开,变量被设置为 null,因此该方法始终返回 null。我理解它为什么这样做,但我不明白如何展开这种类型的递归。任何帮助表示赞赏!

我的findChild()方法:

0 投票
1 回答
412 浏览

c++ - 如何在 C++98 中退出进程而不进行任何展开?

在 C++11 或更高版本中,我们可以调用std::quick_exit退出进程而不进行任何展开,即不会调用析构函数 [after | 期间] std::quick_exit

我有一个项目:

  1. 它有一个全局对象,全局对象的析构函数有一个致命的bug;
  2. 我无法访问全局对象的来源;
  3. 如果我可以std::quick_exit在函数的最后一行调用main,则不会触发该错误;
  4. 出于某种原因,该项目必须使用 C++98 编译器进行编译;也就是说,我不能调用std::quick_exitC++98 编译器。

简而言之:

C++98 中的什么函数相当于 C++11 的std::quick_exit

在 Windows 下,我可以调用ExitProcess(0)强制退出进程而不进行任何清理。

Linux下的对应物是什么?

0 投票
2 回答
132 浏览

c++ - 在构造期间抛出 bad_alloc 时如何实现正确的堆栈展开和 raii

因此,我正在设计一个将处理大量内存的类,并且我想确保它在其构造函数中的内存分配过程中出现问题时正确展开。

这是我所拥有的:

如果我只想在构造函数中的某些后续代码由于 bad_alloc 异常而导致错误之前停止构造此对象,那么我在 catch 块中返回这个是否正确?还是 catch 块在它终止时只是取消构造函数?我是不是把整个事情复杂化了?

0 投票
1 回答
541 浏览

ios - 本机链接错误无法为 XXX 不使用标准框架创建紧凑展开 (MT5209)

我正在开发 Xamarin 并尝试在我的 iPad 上安装 iOS 应用程序。

我想链接一个 Ada 静态库。

所以我有一个libMyLibrary.a+libgnat.a文件和一个 C 标头代码 ( MyLibrary.h)。

  • 在 Xamarin 中,我创建了一个绑定库项目并添加了我的库。
  • 在 Xamarin 中,我添加了上述项目作为对我的 iPad 应用程序的引用。

为了与库通信,我使用了 P/InvokeDllImport(“__Internal”)和我的库的一个程序集(所以我没有任何 MTouch 参数):

但是当我将它部署到 iPad 时,我有很多本机链接错误:

我尝试使用 monotouch 参数但没有成功:

有任何想法吗?


配置:

  • iOS 10.3.2
  • Xamarin 6.3
  • 部署目标 10.3
0 投票
3 回答
843 浏览

c++ - c_str 的这种使用是否具有异常未定义的行为?

我见过几个类似的代码片段,如下所示:

在注释之后的行中Is this okay?,我们读取了在foo函数中使用分配的 c 样式字符串std::string。由于字符串因堆栈展开而被破坏,这是未定义的行为吗?


如果它确实是未定义的行为,如果我们main用这个替换函数呢?

由于没有捕获,编译器不会强制展开堆栈,而是what()在控制台中输出结果并中止程序。那么它仍然是未定义的行为吗?

0 投票
0 回答
1956 浏览

c++ - 错误 C2712 不能在需要对象展开的函数中使用 __try

我正在编写一个简单的 C++ WIN32 API 程序来安装和启动 Windows 服务。我在我的代码中使用 SEH __try&__finaly。不幸的是,我收到了一个已知错误,如下所示:

error C2712 Cannot use __try in functions that require object unwinding.

我尝试使用一些熟悉的方法来解决它,例如将 SEH 代码从主函数移动到另一个函数,或者使用项目属性播放错误:启用 C++ 异常。但没有任何效果。无论如何,这是来源:

0 投票
1 回答
1285 浏览

java - 了解 Java 在抛出异常时的堆栈展开

在讨论和一些关于使用异常与返回值的研究期间,我想到了以下几点:

返回值更便宜并提供更好的性能,而抛出异常需要创建新对象并展开堆栈。

现在,我阅读了堆栈展开,据我了解,这是在跳回堆栈上的下一帧之前释放当前堆栈帧上所有已分配资源的突然过程。特别是在 Java 中,不会释放任何资源,而是当前范围内的所有对象都被取消引用并符合 GC 条件。另一方面,在优雅返回的情况下,由于超出范围,对象会立即被销毁。

问题是这样的:

拥有一个声明了少量实例(例如 3 个)的方法并假设如果抛出异常,它将被捕获到下一个级别(例如,它不会爬升 5 个堆栈级别),是否真的有一个明显的(不确定这是否是正确使用的词)与返回值相比,性能方面的区别?我知道最终在一个简单的场景中不会有明显的差异,但它会导致更大的系统中的差异吗?

请假设在方法中的该点抛出异常是有意义的(这是一种异常情况)并且它不适用于控制流(这是一个已知的错误)。仅出于性能原因,才首选返回值。

0 投票
1 回答
245 浏览

android - unw_init_remote 因 UNW_EBADREG 失败

在android上,在收集特定本机进程的痕迹时,我观察到该进程的特定线程的回溯没有被收集(使用libunwind收集回溯)。

第一次尝试:

第二次尝试:

从文档来看,-3似乎是 UNW_EBADREG。但是我无法弄清楚这个错误代码到底是什么时候返回的?

任何指针表示赞赏!