有关OutputDebugString的一点儿事实
我最近花了一些时间分析OutputDebugString方法。在我的另一个实验中,我需要一个仅依赖于本机API的OutputDebugString版本。在实现它的过程中,我发现了一些关于OutputDebugString的有趣的事实,也许您也会感兴趣。
OutputDebugString的工作原理
简而言之,OutputDebugString尝试将消息发送到附加到给定进程的调试器,如果没有调试器侦听,则尝试将全局节映射到进程内存中并将调试消息保存在其中。我使用本机API实现OutputDebugStringA(ANSI版本)的示例如下:
void NTAPI RtlOutputDebugStringA(_In_opt_ LPCSTR OutputString) {
if (OutputString) {
EXCEPTION_RECORD exceptionRecord{ };
exceptionRecord.ExceptionCode = DBG_PRINTEXCEPTION_C;
exceptionRecord.NumberParameters = ;
exceptionRecord.ExceptionInformation[] = strlen(OutputString) + ;
exceptionRecord.ExceptionInformation[] = 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性能产生负面影响,特别是当多个进程同时向调试输出写入数据时。
有关OutputDebugString的一点儿事实的更多相关文章
- 程序员必须要知道的Hadoop的一些事实
程序员必须要知道的Hadoop的一些事实.现如今,Apache Hadoop已经无人不知无人不晓.当年雅虎搜索工程师Doug Cutting开发出这个用以创建分布式计算机环境的开源软...... 1: ...
- SSAS中事实表中的数据如果因为一对多或多对多关系复制了多份,在维度上聚合的时候还是只算一份
SSAS事实表中的数据,有时候会因为一对多或多对多关系发生复制变成多份,如下图所示: 图1 我们可以从上面图片中看到,在这个例子中,有三个事实表Fact_People_Money(此表用字段Money ...
- 20个人艰不拆的事实:知道真相的我眼泪掉下来 T.T
20个人艰不拆的事实:知道真相的我眼泪掉下来 T.T 原文链接http://www.u148.net/article/113612.html 来源:ruoning WuMo是丹麦画家Mikael Wu ...
- 《C专家编程》第四章——令人震惊的事实:数组和指针并不相同
数组和指针是C语言里相当重要的两部分内容,也是新手程序员最容易搞混的两个地方,本章我们锁定指针与数组,探讨它们的异同点. 首先来看指针与数组在声明上的区别: int a[10]; int *p; 很明 ...
- SqlServer Analysis Service的事实维度关系
什么是Fact(事实)维度关系 开发过SSAS Cube的开发人员应该都知道,Cube的维度用法中有一种叫Fact(事实)关系类型,如下图所示: Fact(事实)维度关系就如同上面截图中红框中的描述一 ...
- 《BI那点儿事—数据的艺术》理解维度数据仓库——事实表、维度表、聚合表
事实表 在多维数据仓库中,保存度量值的详细值或事实的表称为“事实表”.一个按照州.产品和月份划分的销售量和销售额存储的事实表有5个列,概念上与下面的示例类似. Sate Product Mouth U ...
- delphi使用outputdebugstring调试程序和写系统日志
delphi使用outputdebugstring调试程序和写系统日志 procedure TForm1.btn1Click(Sender: TObject); begin OutputDebugSt ...
- 战胜忧虑<3>——学会接受不可避免的事实。
学会接受不可避免的事实. 对必然的事情愉快地承受,就像杨柳承受风雨,水接受一切容器,我们也要承受一切事实. 故事: 在美国庆祝陆军在北非获胜的那一天,我接到国防部送来的一封电报,我的侄儿——我最爱的一 ...
- 使用OutputDebugString输出调试信息
在编写控制台程序的时候我们经常会使用printf输出调试信息,使我们了解程序的状态,方便调试,但是当编写非控制台程序的时候这种方法就行不通了,那我们应该怎么办?上网查了一些方法,大致就如下几种 使用L ...
随机推荐
- 好用的低延迟vps
ZeptoVM是一个俄罗斯的云提供商, 由于提供了黑龙江北边的机房, 所以延迟比较低 注意一定要选Khabarovsk节点, 这个节点延迟很低, 我在上海延迟大约有70ms 缺点就是比较贵, 按照年付 ...
- 【开源监控】Grafana介绍与安装
Grafana介绍与安装 Grafana介绍 场景:由于业务场景,有多个组织机构.需要在某个组织结构下,完成对本机构下的系统的实时监控以及可视化展示.底层已经用zabbix对监控指标做了数据的采集. ...
- Isilon Gen6的换盘步骤
When a drive is faulted and ready for replacement, OneFS will illuminate the Front Panel Fault LED a ...
- Ext.net SelectionModel RowSelection
<SelectionModel> <ext:RowSelectionModel ID="RowSelectionModel1308" runat="se ...
- ThinkPad L460 拆机加ngff ssd与内存
ThinkPad L460 拆机加ngff ssd与内存 参考链接:http://blog.sina.com.cn/s/blog_82793ae60102wgtp.html 原有配置:i5 6200U ...
- 【08】Kubernets:Service
写在前面的话 在 K8S 第一节的时候我们简单提到过 Service 的工作模式有三种:userspace / iptables / ipvs.并且已经知道在目前新版本中默认是 ipvs,前提是在按照 ...
- .net持续集成cake篇之常见文件及路径操作
系列目录 Cake常见文件和路径操作 在自动化构建任务里,很多操作都是跟文件打交道,比如文件打包,文件压缩,文件归档,文件传输,目录清理等.本节介绍一些cake里常见的文件操作方法 Cake相对路径问 ...
- C++ explicit 的用法,就是必须显示调用
- loadrunner 由mdrv进程终止导致的非正常终止
因为脚本迭代次数多的问题,迭代了3次,后来改成了迭代1次(1个Vuser),就不会了,
- 微服务架构 ------ 插曲 Mybatis逆向工程
1.首先是pom.xml, 我们需要引入需要的mvn插件 <?xml version="1.0" encoding="UTF-8"?> <pr ...