有关OutputDebugString的一点儿事实

我最近花了一些时间分析OutputDebugString方法。在我的另一个实验中,我需要一个仅依赖于本机API的OutputDebugString版本。在实现它的过程中,我发现了一些关于OutputDebugString的有趣的事实,也许您也会感兴趣。

OutputDebugString的工作原理

简而言之,OutputDebugString尝试将消息发送到附加到给定进程的调试器,如果没有调试器侦听,则尝试将全局节映射到进程内存中并将调试消息保存在其中。我使用本机API实现OutputDebugStringA(ANSI版本)的示例如下:

void NTAPI RtlOutputDebugStringA(_In_opt_ LPCSTR OutputString) {
    if (OutputString) {
        EXCEPTION_RECORD exceptionRecord{ 0 };

        exceptionRecord.ExceptionCode = DBG_PRINTEXCEPTION_C;
        exceptionRecord.NumberParameters = 2;
        exceptionRecord.ExceptionInformation[0] = strlen(OutputString) + 1;
        exceptionRecord.ExceptionInformation[1] = reinterpret_cast<ULONG_PTR>(OutputString);

        __try {
            RtlRaiseException(&exceptionRecord);
        } __except (EXCEPTION_EXECUTE_HANDLER) {
            NotifyGlobalDebugOutputMonitor(OutputString);
        }
    }
}

RtlOutputDebugStringA(以及OutputDebugString)检查调试器存在的方式非常有趣:它引发了一个异常。如果有一个调试器正在侦听,它将吞了异常(异常代码:0x40010006L表示ANSI消息,0x4001000A表示UNICODE消息),并且处理程序将永远不会执行。我们都知道异常是昂贵的,我们应该只在特殊情况下使用它们。因此,对跟踪的每个写操作都抛出异常似乎不正确。稍后我将向您展示一些基准测试结果和解决此问题的简单方法(我想您已经知道了)。但是关于NotifyGlobalDebugOutputMonitor方法的前几句话。它使用一个全局映射部分、两个事件对象和一个互斥对象来编写调试消息。事件对象和互斥锁保护该节防止并发使用。我不会过多地讨论这个问题;如果你感兴趣,可以看看张玉武关于代码项目的优秀文章。您还可以在github上查看我的实现的源代码(它只是一个POC,所以请不要在接近生产的地方使用它)。可以说,在系统中运行调试输出监视器(如DebugView)也会对OutputDebugString性能产生负面影响,特别是当多个进程同时向调试输出写入数据时。

原文地址:https://www.cnblogs.com/yilang/p/12038397.html

时间: 2024-10-27 21:32:32

有关OutputDebugString的一点儿事实的相关文章

事实就是如此,转自柴静看见

柴静看见第14章节. 二〇〇七年,陕西农民周正龙称自己在一处山崖旁,拍到了野生华南虎,陕西省林业厅召开新闻发布会展示这些老虎照片,宣布已灭绝二十年的华南虎再现. 外界质疑很多,一些人觉得照片上褐红色老虎太假,一动不动,两眼圆瞪,呆呆地顶着大叶子,不像真的,但也只是狐疑,没有定论. 我们开会,讨论做不做此事. 有人说:"一张小破照片儿,有劲么?做什么呀?--找个第二落点吧."第二落点,这是陈虻同志的常用语,意思是比别人高一个台阶想问题.我也犯愁:"找什么落点呀?环境保护?生物多

3星|林毅夫《战胜命运》:事实证明华盛顿共识是错误的,GIFF是穷国发展正道。

本书是林毅夫与喀麦隆一位经济学家合著.基本的观点是:事实证明华盛顿共识是错误的,GIFF是穷国发展正道.GIFF的主要思想是政府找到对标国家,强力推行产业政策. 作为一个经济学外行,读后感觉关于华盛顿共识的错误的推理过程是比较严密的,但是作者推崇的指引穷国致福的明灯GIFF,没有实际应用的案例,这应该是GIFF比较大的一个缺陷. 全书有一些经济学的公式,相对来说可读性稍差. 近期林毅夫给吉林开的振兴经济的药方,基本跟书中的思路一致. 总体评价3星. 以下是书中一些信息的摘抄: 1:简而言之,本书

我对java中任务取消和线程中断的一点儿理解

在JDK中任务就是一个Runnable或Callable对象,线程是一个Thread对象,任务是运行在某个线程中的.我们知道,让线程死亡的方式有2种:正常完成和未捕获的异常.如果想让任务结束,也只有这2种方式. java中虽然提供了抢占式中断Thread.stop(),但这是很不安全的,JDK早已经将其标记成过时的了.在java中如果想取消一个任务,只能使用中断,中断是一种协作机制.也就是说,如果A线程想中断B线程,那么其实是A向B发送了一个中断请求,至于B到底会不会停止执行,取决于B的实现.如

《第四次革命》:3星。关于人工智能的有趣事实与畅想。

本书是关于人工智能的一些相对有点意思的事实.观点.研究.畅想. 关于技术的三个分级我感觉有新意. 总体评价3星. 以下是书中一些内容的摘抄,#号后面是kindle电子书中的页码: 1:1998年初,一份文件在被遗弃前的平均寿命为75天:今天,这一数字预计为45天.其结果就是,链接衰减(linkdecay,即网上资源的链接不再有效)现象已经变得司空见惯.#447 2:改用广告业的一句俗语:我们的数据有一半都是垃圾,只是我们不知道是哪一半.#502 3:这引出了一个让人感到些许放心的正循环:不久之后

佩玛&#183;丘卓:人生基本的事实

佛陀认为,人生有三种特质:无常.苦与无我.在佛陀的眼中,众生身上都烙有这三种印记.从自己的经验去发现这些特质的真实性,可以帮助我们轻松如实地去面对事情的相. 第一次听闻这个教诲时,我觉得这只是一个遥不可及的理论.然而一旦开始留意自己身心的活动,先前的观念就改变了.我从自己的经验中发现,没有一样事物是静止不的.我的情绪就像气候一般不断在变化着.我无法掌控思想和情感的发生,也无法让它们停止不动.它们停止了之后又会继续活动,活动了一会儿又停了下来.即使是最顽强的肉体疼痛感,只要一被注意到,也像潮汐一般

《C专家编程》第四章——令人震惊的事实:数组和指针并不相同

数组和指针是C语言里相当重要的两部分内容,也是新手程序员最容易搞混的两个地方,本章我们锁定指针与数组,探讨它们的异同点. 首先来看指针与数组在声明上的区别: int a[10]; int *p; 很明显的,第一个是数组a,第二个是指针p.下一个问题是a的类型是什么?p的类型是什么?a[0]的类型是int,而a是个数组名,它是否表示整个数组呢?事实并非如此,a是一个指针常量,是一个指向int的指针常量,而p是一个指向int的指针,是一个变量.这是它们的第一个区别:一个是常量,一个是变量.那么常量和

数据仓库专题(4)-分布式数据仓库事实表设计思考---讨论精华

一.前言 上一篇分享博文<数据仓库专题(3)--分布式数据仓库事实表设计思考>后,陆续有各位兄弟参加大讨论,提出了各种问题,关于分布式环境下,维表和事实表设计,进行了比较深入的探讨,在此汇集整理,分享给大家.希望能有更多人参与尽力啊,共同探索分布式数据仓库数据模型的设计. 二.纪要 [活跃]北京-RTB-胖哥(1106110976) 10:21:36 分布式模式下事实表设计思考: 做大做强事实表,做小做弱维表: [冒泡]杭州-电子病历<[email protected]> 10:2

数据仓库专题(3)-分布式数据仓库事实表设计思考

一.前言 最近在设计数据仓库的数据逻辑模型,考虑到海量数据存储在分布式数据仓库中的技术架构模式,需要针对传统的面相关系型数据仓库的数据存储模型进行技术改造.设计出一套真正适合分布式数据仓库的数据存储模型. 二.事实表设计基础 事实表记录发生在现实世界中的操作型事件,其所产生的可度数值.事实表的设计完全依赖于物理活动,不受可能产生的最终报表的影响.事实表中,除数字度量外,事实表总是包含外键,用于关联与之相关的维度,也可以包含退化的维度键和日期/时间戳. 三.传统模式 以FS-LDM数据存储模型Ev

2015第16周一六个事实

很早之前看过这篇文章,内心有所触动,然后就过去了,今天微信订阅号推送又看到还有些触动,就决定再仔细读一下,然后加工上自己的理解,希望对自己有用的同时也能帮助别人.此原文来自cracked.com(6 Harsh Truths That Will Make You a Better Person 六个可以让你变得更强大的残酷事实),后经人翻译后网络上转载很多. 说出5件你引以为豪的事情.写在纸上也好,或者喊出来也好都可以.但这里有一个条件:你不可以列出你“是”怎样的人(比如,我是一个温柔的人,我很