发布模式下的堆栈损坏

问题描述 投票:0回答:0

我正在调试我的程序,它有时会破坏堆栈变量的值。我的环境是linux上的arm64。在我调用另一个函数

A
之后,它发生在函数
B
内部-堆栈在返回时被破坏。

我确切地知道哪个变量发生了变化(它是

std::string_view
类型并且它的长度变得非常大(72057594037927940),我可以在~30分钟内重现它一次并且只能使用
-O2
标志。问题是当我输入
A
在 gdb 中,我看到它的所有局部变量都被“优化掉”了。

  1. 这是否意味着我的变量并不真正在堆栈上,它的值存储在寄存器中?
  2. 如果它在寄存器中,那么在调用子函数期间会发生什么?我会假设寄存器值存储在堆栈中,这是否意味着在调用
    B
    之前添加的堆栈部分发生了损坏?

任何想法如何找到根本原因?现在我可以通过在调用

str.size() > 10
 之后检查 
B(...)

来捕捉它的结果
linux gdb arm64
© www.soinside.com 2019 - 2024. All rights reserved.