我建立了一个小的原型测试程序来处理Windows性能计数器,一切似乎都工作正常。我将它移动到我的主程序加载的dll中,并且有一些fprintf(stderr,“sometext”)导致访问冲突。
我在SO上看这个并没有找到任何满意的答案。我知道它在主线程中运行时工作正常。我假设它来自我生成的TIME_CRITICAL线程进行性能计数器轮询。
它似乎有点“随机”,因为我在轮询功能开始时有printfs打印正常。在底部,他们抛出访问冲突。为什么一些printf / fprintf(stderr)工作正常而其他失败?
编辑我用0作为堆栈大小参数创建线程,默认为默认堆栈大小。我怀疑我在这个帖子中吹了我的筹码,有没有人对此有任何见解? https://docs.microsoft.com/en-us/windows/desktop/api/processthreadsapi/nf-processthreadsapi-createthread
因为我怀疑症状是与printf / fprintfs无关的问题。在程序的早期阶段,我sprintf许多字符串,这是一个结构的一部分。而不是将结构成员的大小传递给sprintf我传递了整个结构的大小,这导致我溢出缓冲区和mangle god知道多少内存。当它在一个主线程中时,它没有溢出到足以炸掉我的堆栈并导致段错误,但它仍然写入缓冲区。
由于独立程序中的函数调用较少,因此覆盖指针的覆盖率为零,当进入实际程序/ dll时,调用层次结构变得非常重要,并且大量缓冲区溢出肯定会覆盖堆栈指针,所以来自地址范围为0x7ABCDEF的线程的printf尝试跳转到0xF1234567的返回地址,从而导致访问声音。
我在这里为未来的读者发布了我的故事。如果下一个人有类似的问题,这里有一些sprintf_s资源:What is sprintf_s analog of sprintf(newpath, "%s%s",...)?