我正在调试运行时崩溃,堆栈跟踪似乎已损坏(请参阅昨天的相关问题:Is the stack corrupted if the EBP frame pointer is NULL?)。
尽管堆栈已损坏,但我在堆栈上看到许多值指向相应.map文件中函数的精确位置。此外,这些函数(在很大程度上,如果不是完全的话)是在这种情况下应该出现在堆栈上的预期函数。
作为一个例子(有很多),这里是堆栈值,以及相应的.map条目值:
0588fe5c: 005caa30 (stack address / value at that address)
0001:001c9a30 __ehhandler$?ProcessTAFRequest@TQueryThread@@UAEXXZ 005caa30 f portable_source:UQueryThread.obj
(.map file entry indicating that address 005caa30 is the starting location of the function noted)
假设(可能不正确)堆栈不已损坏,除了顶部附近,并且我看到的函数地址确实对应于堆栈帧和相应的EIP(返回地址)指针,然后我的问题是:为什么我始终在与堆栈对应的.map文件中看到函数位置的精确值?在过去,我曾多次走过一条未损坏的堆栈跟踪,并且堆栈帧中的EIP指针总是指向靠近,但不是 ,位置.map文件中列出的相应函数的名称。 (这是有道理的,因为返回地址通常位于函数的中间,而不是在开始时。)
有人可以光明吗?