gpt4 book ai didi

debugging - 如何使用 Visual Studio 调试 amd64 上的未对齐访问?

转载 作者:行者123 更新时间:2023-12-03 01:25:39 27 4
gpt4 key购买 nike

我想调试和分析一些执行未对齐访问的 64 位软件,如以下示例所示:

int foo[2] = { 1, 2 };
*((int *)((char *)foo + 2)) = 3;

gcc 方式

我知道使用gccgdb时有两种方法可以做到这一点。第一个是直接在我的 C 或 C++ 代码中启用 eflags 寄存器中的对齐检查位(位 18):

asm volatile("pushf \n"
"pop %%rax \n"
"or $0x40000, %%rax \n"
"push %%rax \n"
"popf \n" ::: "rax");

这非常方便,因为我可以在应用程序本身内选择是否绕过未对齐的访问检查,例如在调用已知的错误库时。

另一种方式是从gdb,在调试可执行文件时的任何时刻:

set $eflags |= 1<<18

同样,这可以随意启用或禁用、编写脚本等。非常方便。

Visual Studio

现在我完全无法在 Vista64 上使用 Visual Studio 20082010 执行相同的操作。 C++ 程序中的内联汇编是 no longer available在任何版本的 Visual Studio 的 x64 模式下,但我可以使用 intrinsics相反:

#include <intrin.h>
/* ... */
__writeeflags(__readeflags() | 0x40000);

这与 Linux 上的代码完全相同。它有点作用:当我的错误代码运行时,我得到了异常。除了每次遇到断点时,EFL.AC 标志都会重置为零。这意味着我无法正确调试具有大量复杂断点的大型应用程序,除非我在代码中调用我的 asm 函数。

因此,我尝试从 Visual Studio 注册调试 session 中手动更改 EFL |= 0x40000(这正是我通常在 Linux 上执行的操作)。也没有效果,一旦我恢复调试,该位就设置为零。这意味着我无法正确调试没有源代码的代码。

我不明白这是怎么回事。是Visual Studio强制设置了EFL.AC=0吗?如果是这样,我可以禁用该“功能”吗?另外,有没有办法在调试 session 期间启用/禁用 EFL.AC

现实世界的 Windows 开发人员如何跟踪代码中未对齐的访问?

编辑:发现__readeflags ,这不在 list of x64 intrinsics 中.

最佳答案

不幸的是,在 VS 中调试 x64 调试器时,会清除任何异常(包括首先抛出进入调试器的异常)的对齐检查标志。您是否尝试过使用 Windbg(功能更强大的 Windows 调试器)单步调试代码?我无法使用 Acflags来尝试它,但使用 r efl= 或直接从寄存器窗口应该很简单。如果您没有安装windbg,您可以从最新的Windows SDK获取它。

关于debugging - 如何使用 Visual Studio 调试 amd64 上的未对齐访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5498102/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com