2009-10-06 80 views
1

为了进行调查,我需要知道硬编码值的存储位置。硬编码值存储在哪里?

问题:一个函数里面有硬编码的值,这个函数被许多线程同时调用,这个硬编码值是否有可能被破坏。

例如: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; 
    } 

回答

3

文字字符串存储在您的节目图像时的.data节他们被编译。 .data部分通常映射到只读存储器,因此它不会像.code部分那样被损坏。您可以通过使用visual studio附带的dumpbin.exe来查看Windows EXE/DLL的.data部分。

有没有简单的方法来破坏这个文字,它可以完成,如果你修改它存储在内存页的权限,但你必须明确做到这一点通过使用OS API,而不是一个C++ API 。在编译时硬编码到机器代码中的地址是一个相对偏移量(如果内存服务于它,则是数据段基地)。该偏移量被添加到由操作系统加载程序提供的基址中。

如果你的堆栈损坏了,你最终会遇到基地址无效的情况,所以当添加偏移量时,文字看起来会损坏。

4

没有,字符串文字不会在这种情况下损坏,因为他们不正在写入。

但是:如果您不锁定/同步使用该输出流,则可能会看到类似于损坏的输出混合。

+0

谢谢安德鲁,“如果你不锁定/同步”我的日志记录的东西是线程安全的,但任何如何字符串文字被损坏导致崩溃:( – Satbir 2009-10-06 05:29:34

+0

@Soni:真的,我怀疑,否则你会不会得到错误,但是如果没有log(x)的定义很难说, – 2009-10-06 08:06:36

3

字符串文字通常存储在进程内存的只读部分,并且在您的代码中,您没有(也不应该)写入它们。它们被用来构造一个新的字符串,并将这些文字的内容复制到它中。

如果你正在写这些文字的内存地址,你会知道它:)(即它通常会引起程序崩溃)