visual-studio - 调用栈和反汇编疑惑

标签 visual-studio debugging assembly windbg

三疑 1) 假设我得到如下调用堆栈

    user32.dll!_InternalCallWinProc@20()  + 0x28 bytes  
user32.dll!_UserCallWinProcCheckWow@32()  + 0xb7 bytes  
user32.dll!_CallWindowProcAorW@24()  + 0x51 bytes   
user32.dll!_CallWindowProcW@20()  + 0x1b bytes  

现在每个函数末尾提到的字节是什么?就像第一个语句什么是 0x28 字节。

2) 如何在 VS 中的 Windows 系统 dll 上放置断点? 在 windbg 中,我可以搜索 windows 系统 dll 的特定功能,如

>x wininet!*funcA*

用这个命令我可以得到这个函数的地址并且可以放置断点。 我可以在 Visual Studio 中做同样的事情吗?

3) 我没有dll 的符号文件。我在反汇编中得到的调用堆栈是

7814XXX0  call        dword ptr [__imp__WindowsFuncA@32 (781EXXXXh)] 

上面调用栈中的__imp__是什么?这是否意味着此 Windows 函数已挂接到其他某个 dll?

最佳答案

1) 它们是在该堆栈帧中执行的指令相对于函数开始的字节偏移量。

2) 在“新建断点”对话框中输入如下内容:

{,,user32.dll}_SendMessageW@16

其中 16 是函数期望的参数字节数(在 Win32 中,这几乎总是参数数的 4 倍)。 W 指的是 API 的 Unicode 版本;如果您正在调试 ANSI 应用程序,请使用 A

3) __imp__ 引用 DLL 导入表 - 当前模块中的代码通过 JMP 重定向到真正的 Windows DLL ,而 __imp__ 符号指的是 JMP。这些 JMP 存在于进行调用的 DLL 或 EXE 中的表中。

关于visual-studio - 调用栈和反汇编疑惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1006468/

相关文章:

c++ - 在Visual Studio中创建Linux控制台应用程序时遇到问题

CSS 使用初始值计算

计算温度项目,产生误差

C/GDB : display contents of address

debugging - 如何在 NCrunch 中调试失败的测试方法

debugging - Emacs中如何实现错误回溯?

c - 用于在 x86 程序集中在 8bpp 位图和 24bpp 位图上绘制实心圆的 Bresenham 算法

c# - VC++ 项目总是过时

windows - Windows 和 native API 中的系统调用?

exception - 有人可以解释一下大 fs :0?