callstack相关内容

推送到全堆栈8086程序集

推送到完整堆栈的物理后果是什么 令人惊讶的是,当只为堆栈分配2个字节[1个字]并将三个字推入不同的寄存器时,这一过程没有任何错误 推送第二项时,我应该怎么说堆栈内容 下面是堆栈段定义: Stack_segment_name segment para stack db 2 dup(0) ;define your stack segment Stack_segment_name ends ..
发布时间:2022-08-23 20:43:22 其他开发

计算方法调用堆栈大小以检查 StackOverflowException

今天早上我回答了一个与 StackoverflowException 相关的问题.该人已询问何时发生 Stackoverflow 异常 查看此链接最简单的方法在 C#、C++ 和 Java 中导致堆栈溢出 所以我的问题是,是否有任何方法可以在我们的程序中动态计算方法调用堆栈的大小,然后在调用方法之前应用检查来检查方法调用堆栈是否有空间来容纳它以防止堆栈溢出异常. 由于我是 jav ..
发布时间:2022-01-22 12:56:37 Java开发

有没有办法在 C# 运行时检查堆栈变量?

有没有办法在运行时转储堆栈的内容? 我对可以通过 StackTrace 和 StackFrame 类获得的父函数信息(名称、参数、行)感兴趣.但是,我还想获取堆栈中的变量(在调用当前正在执行的方法中声明的局部变量).由于 Visual Studio 调试器可以做到这一点,我认为可能有一种方法可以在运行时在代码中做到这一点.有没有这样的方法? 解决方案 我想有两种方法可以实现. ..
发布时间:2022-01-22 12:23:25 C#/.NET

使用mingw编译时增加堆栈大小?

我正在编写一个递归洪水填充算法来查找图像中的连接组件,我的代码在 MSVC 2008 编译器中编译和运行良好;但是 mingw 编译的二进制文件在运行时崩溃了. 在我使用 std::stack 将算法转换为非递归后,一切顺利. 但是如果我在某些情况下必须使用递归算法,而 mingw 无法处理呢? 如何增加二进制文件的堆栈大小,是否有任何编译选项? 谢谢 解决方案 使 ..
发布时间:2022-01-22 12:13:26 C/C++开发

为什么堆栈地址会朝着减少的内存地址增长?

我在教科书中读到堆栈通过减少内存地址而增长;即从高地址到低地址.这可能是一个糟糕的问题,但我没有正确理解这个概念.你能解释一下吗? 解决方案 首先,它依赖于平台.在某些架构中,堆栈是从地址空间的底部开始分配并向上增长的. 假设像 x86 这样的架构从地址空间的顶部向下堆栈,这个想法很简单: =============== 最高地址(例如 0xFFFF)|||堆栈 ||||----- ..
发布时间:2022-01-22 12:06:50 其他开发

当我写到数组的末尾时,为什么我的程序不会崩溃?

为什么下面的代码在运行时没有任何崩溃? 而且大小完全取决于机器/平台/编译器!!.我什至可以在 64 位机器上提供多达 200 个.如何在 OS 中检测到 main 函数中的分段错误? int main(int argc, char* argv[]){int arr[3];arr[4] = 99;} 这个缓冲空间是从哪里来的?这是分配给进程的栈吗? 解决方案 前段时间为了教育目的 ..
发布时间:2022-01-22 12:01:09 其他开发

64位堆栈驻留缓冲区溢出?

我正在研究一些与安全相关的东西,现在我正在玩我自己的堆栈.我所做的应该很简单,我什至没有尝试执行堆栈,只是为了表明我可以控制我的 64 位系统上的指令指针.我已经关闭了所有我知道的保护机制,只是为了能够使用它(NX-bit,ASLR,也使用 -fno-stack-protector -z execstack 编译).我在 64 位汇编方面没有太多经验,在花了一些时间搜索和试验自己之后,我想知道是否 ..
发布时间:2022-01-20 20:44:41 服务器开发

有没有办法在 gdb 中设置一个以调用堆栈为条件的断点?

我正在 Linux 上的 gdb 7.1 中调试 C++. 我有一个函数 a() 在代码的很多地方都被调用.我想在其中设置一个断点,但前提是它是从 b() 调用的.有什么办法吗? 只有在 c() 调用 b() 时,有什么办法可以做到这一点,以此类推吗? 解决方案 更新: 现在有一个 更好地回答这个问题:使用 GDB _is_caller 便利函数. 您描述的需求经常出现, ..
发布时间:2022-01-20 19:51:05 C/C++开发

C 编译器可以重新排列堆栈变量吗?

我过去曾参与过嵌入式系统的项目,我们重新安排了堆栈变量的声明顺序以减小生成的可执行文件的大小.例如,如果我们有: void func(){字符 c;诠释我;短裤;...} 我们会将其重新排序为: void func(){诠释我;短裤;字符 c;...} 由于对齐问题,第一个导致使用了 12 个字节的堆栈空间,而第二个导致仅使用了 8 个字节. 这是 C 编译器的标准行为还是我们使用的 ..
发布时间:2022-01-17 08:24:26 C/C++开发

如何在没有有用的调用堆栈的情况下调试难以重现的崩溃?

我在我们的软件中遇到了一个奇怪的崩溃,我在调试它时遇到了很多麻烦,所以我寻求 SO 的建议来解决它. 崩溃是读取 NULL 指针的访问冲突: $00CF0041 的第一次机会例外.带有消息的异常类 $C0000005'在 0x00cf0041 的访问冲突:读取地址为 0x00000000'. 它只发生在“有时"——我还没有弄清楚什么时候发生的任何韵律或原因——而且只发生在主线程中 ..
发布时间:2022-01-12 11:23:37 其他开发

为什么使用 ebp 比使用 esp 寄存器更好地定位堆栈上的参数?

我是 MASM 的新手.我对这些指针寄存器感到困惑.如果你们能帮助我,我将不胜感激. 谢谢 解决方案 使用 [ebp + disp8] 编码寻址模式比 [esp+disp8] 短一个字节>,因为使用 ESP 作为基址寄存器需要一个 SIB 字节.有关详细信息,请参阅rbp 不允许作为 SIB 基础?.(该问题的标题是关于 [ebp] 必须被编码为 [ebp+0] 的事实.) 第 ..
发布时间:2022-01-06 13:09:06 其他开发

在 Clojure 中获取调用堆栈

当我运行 Clojure 程序并在执行过程中出错时,我注意到 REPL 打印的消息仅包含我执行的脚本中的顶级行号.我可以让它转储调用堆栈(引用 Clojure 代码的各种行号)吗? 例如: user=>(加载文件“test.clj")java.lang.IllegalArgumentException: 错误数量的 args (1) 传递给:user$eval134$fn (test.cl ..
发布时间:2022-01-02 23:08:38 其他开发

为什么堆栈地址会朝着减少内存地址的方向增长?

我在教科书中读到堆栈通过减少内存地址而增长;即从高地址到低地址.这可能是一个糟糕的问题,但我没有理解正确的概念.你能解释一下吗? 解决方案 首先,它依赖于平台.在某些架构中,栈是从地址空间的底部开始分配并向上增长. 假设像 x86 这样的架构从地址空间的顶部向下堆栈,这个想法非常简单: ================ 最高地址(例如 0xFFFF)|||堆栈 ||||------ ..
发布时间:2021-12-24 16:47:54 其他开发

如何查看 SharePoint 2010 中的异常调用堆栈?

我正在尝试将 SharePoint 2007 网站集功能移植到 2010.在功能激活期间,SharePoint 显示“死亡黄屏",说明“此应用程序的当前自定义错误设置阻止了应用程序错误的详细信息看过.". AFAIK 我已经配置了查看错误所需的一切:在 c:\inetpub\wwwroot\wss\VirtualDirectories\80\web.config 我已经设置了 ..
发布时间:2021-12-23 18:51:58 其他开发

_chkstk() 函数的目的是什么?

我最近使用了 /FAsu Visual C++ 编译器option 输出一个特别长的成员函数定义的源代码+程序集.在汇编输出中,在设置堆栈帧后,会调用一个神秘的 _chkstk() 函数. _chkstk() 上的 MSDN 页面a> 没有解释调用这个函数的原因.我还看到了堆栈溢出问题 在堆栈上分配更多页面大小的缓冲区会损坏内存吗?,但我确实这样做了不明白 OP 和接受的答案在说什么. ..
发布时间:2021-12-22 18:29:25 C/C++开发

什么是 ESP 和 EBP 寄存器?

我发现ESP寄存器是当前堆栈指针,EBP是当前堆栈帧的基指针.但是,我不明白这些定义(我刚刚开始学习如何在汇编程序中编码). 据我所知,ESP 指向堆栈本身,而 EBP 指向堆栈顶部的任何内容1.但这些只是我的猜测,它们很可能是不正确的.否则,下面这样的语句是什么意思? MOV EBP, ESP 脚注 1:编者注:是的,这是不正确的.在标准术语中,“栈顶"是 ESP 指向的地方,即使它是 ..
发布时间:2021-12-18 09:38:03 其他开发

为什么 gcc 使用 movl 而不是 push 来传递函数 args?

注意这段代码: #include void a(int a, int b, int c){字符缓冲区1[5];字符缓冲区2[10];}int main(){一(1,2,3);} 之后: gcc -S a.c 该命令在汇编中显示我们的源代码. 现在我们可以在主函数中看到,我们从不使用“push"命令来推送参数a 函数入栈.它使用了“移动"而不是那个 主要:pushl %ebpmovl ..
发布时间:2021-12-18 09:09:13 其他开发

堆栈如何在汇编语言中工作?

我目前正在尝试了解堆栈的工作原理,因此我决定自学一些汇编语言,我正在使用这本书: http://savannah.nongnu.org/projects/pgubook/ 我正在使用 Gas 并在 Linux Mint. 我有点困惑: 据我所知,堆栈只是一种数据结构.所以我假设如果我在汇编中编码,我必须自己实现堆栈.然而,情况似乎并非如此,因为有像 这样的命令 push ..
发布时间:2021-12-18 09:02:15 其他开发