为了进行调查,我需要知道硬编码值存储在哪里。
问题:内部具有硬编码值的函数,并且许多线程同时调用此函数,硬编码值是否有可能被破坏。
例如:myFunc由多个线程同时调用。 可以将文字“未处理的异常:”损坏
void myFunc()
{
EXCEPTION_RECORD ExceptRec
bool retValue=doSomething(ExceptRec);
if(!retValue)
{
log ("Unhandled exception:"<< " code = " << hex << ExceptRec.ExceptionCode
<< " flags = " << ExceptRec.ExceptionFlags
<< " address = " << ExceptRec.ExceptionAddress)
// log is macro which will insert content into ostrstream
}
}
函数doSomething看起来像:
bool doSomething(EXCEPTION_RECORD &ExceptRec)
{
__try
{
// some code here
}
__except (ExceptRec = *(GetExceptionInformation())->ExceptionRecord,
EXCEPTION_EXECUTE_HANDLER)
{
return false;
}
return true;
}
不,字符串文字在这种情况下不会被破坏,因为它们没有被写入。
但是:如果您不锁定/同步该输出流的使用,则可能会看到类似于损坏的输出混合。
字符串文字通常存储在进程内存的只读部分中,并且存储在代码中,您不能(也不应)对其进行写入。 它们被用来构造一个新的字符串,并将这些文字的内容复制到其中。
如果您正在写这些文字的内存地址,您就会知道:)(即,它通常会使程序崩溃)
文字字符串在编译时存储在程序映像的.data节中。 .data节通常被映射到只读存储器中,因此不会像.code节一样被破坏。 您可以使用Visual Studio附带的dumpbin.exe查看Windows exe / dll的.data部分。
没有简单的方法来破坏此文字,如果您修改存储在其上的内存页面的权限,可以做到这一点,但是您必须使用OS api(而不是c ++ api)来显式地做到这一点。 在编译时硬编码到机器代码中的地址是一个相对偏移量(如果内存为我服务,则是到数据段的基础)。 此偏移量将添加到操作系统加载程序提供的基址中。
如果您的堆栈已损坏,您可能会遇到基址无效的情况,因此当添加偏移量时,文字看起来已损坏。