如果到目前为止您还没有机会调试优化的x64代码,请不要再等待太久,也不要落后于时代!由于类似x64 fastcall的调用约定加上大量的通用寄存器,在调用堆栈中的任意点查找变量值确实非常困难。
在本文中,我想详细介绍一些我最喜欢的调试优化x64代码的技术。但是在深入研究这些技术之前,让我们先对x64调用约定有一个快速的概述。

x64调用约定

熟悉x86平台上fastcall调用约定的人将认识到与x64调用约定的相似之处。通常,您必须了解x86平台上的多个调用约定,而在x64平台上,目前只有一个。在这种情况下,通过__declspec(naked)调用(当然不包括直接调用)可以实现编码
我不会详细介绍x64呼叫约定的所有细微差别,因此我建议您查看以下链接(http://msdn.microsoft.com/en-us/library/ms794533.aspx). 但是通常,函数的前四个参数是通过寄存器rcx、rdx、r8和r9传递的。如果函数接受四个以上的参数,则这些参数将传递到堆栈上。(熟悉x86 fastcall调用约定的人,其中前两个参数是在ecx和edx中传递的,熟悉这种约定的人会认识到它们的相似之处)。
为了帮助说明x64调用约定是如何工作的,我创建了一些简单的示例代码。虽然代码是人为设计的,与真实世界中的代码相去甚远,但它演示了在实际世界中可能遇到的一些场景。代码如下所示。

#include <stdlib.h>#include<stdio.h>#include<windows.h>__declspec(noinline)voidFunctionWith4Params(int param1, int param2, intparam3,intparam4 )

{

size_t lotsOfLocalVariables1
=rand();

size_t lotsOfLocalVariables2
=rand();

size_t lotsOfLocalVariables3
=rand();

size_t lotsOfLocalVariables4
=rand();

size_t lotsOfLocalVariables5
=rand();

size_t lotsOfLocalVariables6
=rand();

DebugBreak();

printf(
"Entering FunctionWith4Params( %X, %X, %X, %X )\n",

param1, param2, param3, param4 );

printf(
"Local variables: %X, %X, %X, %X, %X, %X \n",

lotsOfLocalVariables1, lotsOfLocalVariables2,

lotsOfLocalVariables3, lotsOfLocalVariables4,

lotsOfLocalVariables5, lotsOfLocalVariables6 );

}

__declspec(noinline)
voidFunctionWith5Params(int param1, int param2, intparam3,int param4, intparam5 )

{

FunctionWith4Params( param5, param4, param3, param2 );

FunctionWith4Params( rand(), rand(), rand(), rand() );

}

__declspec(noinline)
voidFunctionWith6Params(int param1, int param2, intparam3,int param4, int param5, intparam6 )

{

size_t someLocalVariable1
=rand();

size_t someLocalVariable2
=rand();

printf(
"Entering %s( %X, %X, %X, %X, %X, %X )\n","FunctionWith6Params",

param1, param2, param3, param4, param5, param6 );

FunctionWith5Params( rand(), rand(), rand(),

param1, rand() );

printf(
"someLocalVariable1 = %X, someLocalVariable2 = %X\n",

someLocalVariable1, someLocalVariable2 );

}
intmain(int /*argc*/, TCHAR** /*argv*/)

{
//I use the rand() function throughout this code to keep//the compiler from optimizing too much. If I had used//constant values, the compiler would have optimized all//of these away. int params[] ={ rand(), rand(), rand(),

rand(), rand(), rand() };

FunctionWith6Params(
params[0], params[1], params[2],params[3], params[4], params[5] );return 0;

}

标签: none

添加新评论