问题标签 [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 投票
6 回答
13244 浏览

c++ - 为什么异常时不调用析构函数?

我希望A::~A()在这个程序中被调用,但它不是:

但是,如果我将最后一行更改为

然后A::~A() 调用。

我正在使用 Visual Studio 2005 中的“Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86”进行编译。命令行为cl /EHa my.cpp.

编译器是否像往常一样正确?标准在这个问题上怎么说?

0 投票
3 回答
2028 浏览

c - HP-UX 和 Linux 上的堆栈展开

我需要在某些点获取我的 C 应用程序的堆栈信息。我已经阅读了文档并搜索了网络,但仍然无法弄清楚我该怎么做。你能指出一个简单的过程解释吗?或者,甚至更好的是堆栈展开的示例。我需要它用于 HP-UX (Itanium) 和 Linux。

0 投票
11 回答
4892 浏览

c++ - 离开 c++ 函数时程序崩溃......你认为它是什么?

我有一个 c++ 代码,我使用 MSC9 来编译它。它一直在随机崩溃。例如,如果使用 `` 从 Perl 调用它会崩溃,但从命令行或 Ultimate++ 调用它不会崩溃。

我的意思是从 perl 中调用它,例如。f.exe arg1 arg2 arg3

堆栈跟踪没有显示太多。逐行跟踪程序证明程序在返回时最后失败...

所以就是这样

我猜堆栈已损坏,堆栈展开后,它崩溃了..

什么会导致它?该程序使用 pcre、stl 和迭代器。迭代器可以破坏堆栈吗?你会如何捕捉到这样的错误?

它可能是编译器错误吗?

注意:调试版不会崩溃,只有发布版...

该错误似乎与此 pvector 类有关。

我有一个类似于这样的结构:

它似乎失败了,因为这一行:

我认为问题出在下面的类... std::copy 在 pvector operator=(const pvector &pv) 中是正确的,对吗?

pvector 是一个 perl 兼容的向量...它的索引可以大于向量的分配大小。

更新 1:我收到了作业中存在泄漏的建议。我改变了分配......现在看起来是这样的:

注意:通过将 & 添加到返回类型,崩溃仍然存在。但是,删除泄漏后,添加 delete [] m_rgArray; ,程序不再崩溃。我不明白。据我所知,泄漏不会导致崩溃。所以问题似乎解决了(?)。问号表示我的惊讶。Update2:不,问题又回来了。它只是消失了一段时间。Update3:我想我已经找到了。我使用了来自 Microsoft 调试工具的实用程序 gflags.exe 和 windbg.exe 来查找确切位置。我使用 gflags.exe /p /enable myprog.exe /full 来打开堆错误的异常。目前,我认为该错误是由 FindClose(handle); 引起的。其中句柄是一个随机值,未初始化。

旧版:

0 投票
3 回答
209 浏览

c - 指针问题

好的,我经历了 2 层函数 fun1 调用 func2 调用 func3 。我基本上使用 int *ptr 一直向下传递一个指针,在调用堆栈的最低“级别”我还有另一个函数,它为 int 数组动态分配内存。在顶层(func1 级别),我总是为传递的指针返回 null。我已经追溯到 func3 并且分配的内存正在填充值,但是随着调用堆栈展开 func3 -> func2 突然指针就消失了(0x0000_0000)?我在func3级别不明白我基本上说ptr = allocate_ptr_array,但是从那个返回它变成NULL!即使我没有释放内存,这到底是怎么回事?我知道我的问题令人困惑。我已经在调试器中看到了这种情况

0 投票
7 回答
707 浏览

c++ - 异常处理

我听说人们说异常处理有点昂贵,因为堆栈展开。

我没有得到任何东西,无论我抛出异常以及是否使用“return”,都会发生堆栈展开。那么区别在哪里呢?

例如,如果我遇到无法处理的内存问题 - 唯一的选择是停止该功能,直到我到达应该处理或通知问题的区域。那么我抛出异常的其他选择是什么?

我可以使用“return”而不是抛出异常,但它是一样的。我知道堆栈展开甚至可以返回六个堆栈,但是检查返回值和“返回”结合起来。

欢迎解释。

0 投票
4 回答
3861 浏览

c# - .Net - 什么是“放松”?

在回答这个问题时,我注意到在处理异常时尝试移动“光标”时出现以下对话框:

无法将下一条语句设置为此位置。展开调用堆栈的尝试失败。

在以下情况下无法展开:

  1. 调试是通过即时调试开始的。
  2. 放松正在进行中
  3. 已引发 System.StackOverflowException 或 System.Threading.ThreadAbortException 异常。

究竟什么是放松

0 投票
5 回答
52805 浏览

assembly - Gnu Assembler (GAS) 中的 CFI 指令有什么用途?

每行之后似乎都有一个 .CFI 指令,并且这些示例的种类繁多.cfi_startproc.cfi_endproc等等。 更多here

我没有明白这些的目的。

0 投票
4 回答
2838 浏览

java - 堆栈展开问题上的 Java 和 C++

据我所知,如果发生未捕获的异常,C++ 会立即销毁局部变量,Java 释放引用并将其余部分留给垃圾收集器。

这是正确的吗?在这个问题上,Java 和 C++ 到底有什么区别?换句话说,就堆栈展开问题而言,这两种语言中的哪一种被认为更好?:)

0 投票
6 回答
1955 浏览

c++ - 在 C++ 中正常调用块退出时如何破坏局部变量?

C++ 自动以相反的顺序调用块中所有局部变量的析构函数,无论该块是正常退出(控制失败)还是抛出异常。

看起来术语堆栈展开仅适用于后者。关于销毁局部变量,如何调用前一个进程(块的正常退出)?

0 投票
2 回答
718 浏览

c++ - 停止调试时堆栈是否展开?

只是好奇我的析构函数是否被调用。
(特别是对于 Visual Studio,当您点击红色停止按钮时)