fprintf stderr segfaults在自己的主题中,在main中工作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了fprintf stderr segfaults在自己的主题中,在main中工作相关的知识,希望对你有一定的参考价值。

我建立了一个小的原型测试程序来处理Windows性能计数器,一切似乎都工作正常。我将它移动到我的主程序加载的dll中,并且有一些fprintf(stderr,“sometext”)导致访问冲突。

我在SO上看这个并没有找到任何满意的答案。我知道它在主线程中运行时工作正常。我假设它来自我生成的TIME_CRITICAL线程进行性能计数器轮询。

  1. 这种访问违规的原因是什么?它表示“在main.exe 0xC00000005中的0x7deadbeef处未处理的异常。从0xFbeefdead读取访问冲突”。
  2. 从单独的线程打印到stderr的适当方法是什么?

它似乎有点“随机”,因为我在轮询功能开始时有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",...)?

以上是关于fprintf stderr segfaults在自己的主题中,在main中工作的主要内容,如果未能解决你的问题,请参考以下文章

fprintf中使用stderr

何时使用 printf vs fprintf(stderr) [重复]

什么时候应该使用 perror("...") 和 fprintf(stderr, "...")?

stderr 和stdout

fprintf与stderrstdout的使用

在c中打印到stderr [重复]