﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-passbian</title><link>http://www.cppblog.com/passbian/</link><description /><language>zh-cn</language><lastBuildDate>Sat, 18 Apr 2026 06:47:03 GMT</lastBuildDate><pubDate>Sat, 18 Apr 2026 06:47:03 GMT</pubDate><ttl>60</ttl><item><title>__declspec(selectany) 的作用是什么 </title><link>http://www.cppblog.com/passbian/archive/2010/02/03/107100.html</link><dc:creator>卞冬华</dc:creator><author>卞冬华</author><pubDate>Wed, 03 Feb 2010 05:56:00 GMT</pubDate><guid>http://www.cppblog.com/passbian/archive/2010/02/03/107100.html</guid><wfw:comment>http://www.cppblog.com/passbian/comments/107100.html</wfw:comment><comments>http://www.cppblog.com/passbian/archive/2010/02/03/107100.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/passbian/comments/commentRss/107100.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/passbian/services/trackbacks/107100.html</trackback:ping><description><![CDATA[<h2>&nbsp;在MFC，ATL的源代码中充斥着__declspec(selectany) &nbsp; 的声明。selectany可以让我们在.h文件中初始化一个全局变量而不是只能放在.cpp中。比如有一个类，其中有一个静态变量，那么我们可以在.h 中通过类似" &nbsp; __declspec(selectany) &nbsp; type &nbsp; class::variable &nbsp; = &nbsp; value; &nbsp; "这样的代码来初始化这个全局变量。既是该.h被多次include，链接器也会为我们剔除多重定义的错误。这个有什么好处呢，我觉得对于 teamplate的编程会有很多便利。 </h2>
<img src ="http://www.cppblog.com/passbian/aggbug/107100.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/passbian/" target="_blank">卞冬华</a> 2010-02-03 13:56 <a href="http://www.cppblog.com/passbian/archive/2010/02/03/107100.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WINDBG获取套件类型</title><link>http://www.cppblog.com/passbian/archive/2009/09/21/96827.html</link><dc:creator>卞冬华</dc:creator><author>卞冬华</author><pubDate>Mon, 21 Sep 2009 02:23:00 GMT</pubDate><guid>http://www.cppblog.com/passbian/archive/2009/09/21/96827.html</guid><wfw:comment>http://www.cppblog.com/passbian/comments/96827.html</wfw:comment><comments>http://www.cppblog.com/passbian/archive/2009/09/21/96827.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/passbian/comments/commentRss/96827.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/passbian/services/trackbacks/96827.html</trackback:ping><description><![CDATA[<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: xx-small; font-family: SimSun;"><span style="font-size: 9pt; font-family: simsun;" lang="ZH-CN">在对基于</span></span><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">COM</span></span><span style="font-size: xx-small; font-family: SimSun;"><span style="font-size: 9pt; font-family: simsun;" lang="ZH-CN">的应用程序进行调试时，线程的套间类型，往往是我们必须知道的信息。如果应用程序是基于</span></span><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">.Net</span></span><span style="font-size: xx-small; font-family: SimSun;"><span style="font-size: 9pt; font-family: simsun;" lang="ZH-CN">的，那么问题很容易解决。我们可以加载</span></span><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">SOS</span></span><span style="font-size: xx-small; font-family: SimSun;"><span style="font-size: 9pt; font-family: simsun;" lang="ZH-CN">扩展库，然后调用</span></span><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">!comstate</span></span><span style="font-size: xx-small; font-family: SimSun;"><span style="font-size: 9pt; font-family: simsun;" lang="ZH-CN">命令，即可列出所有线程的套间类型。但是如果应用程序不是基于</span></span><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">.Net</span></span><span style="font-size: xx-small; font-family: SimSun;"><span style="font-size: 9pt; font-family: simsun;" lang="ZH-CN">的，</span></span><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">SOS</span></span><span style="font-size: xx-small; font-family: SimSun;"><span style="font-size: 9pt; font-family: simsun;" lang="ZH-CN">扩展库将无法使用。这时如何获取线程的套间类型呢？</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: xx-small; font-family: SimSun;"><span style="font-size: 9pt; font-family: simsun;" lang="ZH-CN">要想获取套间类型信息，必须知道这个信息存在什么地方。答案是线程的</span></span><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">TEB</span></span><span style="font-size: xx-small; font-family: SimSun;"><span style="font-size: 9pt; font-family: simsun;" lang="ZH-CN">里。查看</span></span><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">TEB</span></span><span style="font-size: xx-small; font-family: SimSun;"><span style="font-size: 9pt; font-family: simsun;" lang="ZH-CN">结构，可以看到在其偏移</span></span><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">0xf80</span></span><span style="font-size: xx-small; font-family: SimSun;"><span style="font-size: 9pt; font-family: simsun;" lang="ZH-CN">处，有一个字段</span></span><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">ReservedForOle</span></span><span style="font-size: xx-small; font-family: SimSun;"><span style="font-size: 9pt; font-family: simsun;" lang="ZH-CN">。如下所示：</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">0:000&gt; dt ntdll!_TEB</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;"><span>&nbsp;&nbsp; </span>&#8230;&#8230;</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;"><span>&nbsp;&nbsp; </span>+0xf7c ReservedForPerf<span>&nbsp; </span>: Ptr32 Void</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;"><span>&nbsp;&nbsp; </span>+0xf80 ReservedForOle<span>&nbsp;&nbsp; </span>: Ptr32 Void</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;"><span>&nbsp;&nbsp; </span>+0xf84 WaitingOnLoaderLock : Uint4B</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;"><span>&nbsp;&nbsp; </span>&#8230;&#8230;</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: xx-small; font-family: SimSun;"><span style="font-size: 9pt; font-family: simsun;" lang="ZH-CN">当一个线程与一个套间关联上后，这个字段会保存一个指针，指向一个与套间相关的线程局部存储的数据结构。在这个数据结构的</span></span><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">0xc</span></span><span style="font-size: xx-small; font-family: SimSun;"><span style="font-size: 9pt; font-family: simsun;" lang="ZH-CN">偏移处，存放的正是套间的类型信息。</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: xx-small; font-family: SimSun;"><span style="font-size: 9pt; font-family: simsun;" lang="ZH-CN">根据以上知识，我们可以如下获取套间类型：</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">0:000&gt; r $teb</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">$teb=7ffdd000</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">0:000&gt; dd 7ffdd000+f80 l1</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">7ffddf80<span>&nbsp; </span>0016f178</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">0:000&gt; dd 16f178+c l1</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">0016f184<span>&nbsp; </span>0000008b</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">0:000&gt; ? 8b &amp; 80</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">Evaluate expression: 128 = 00000080</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: xx-small; font-family: SimSun;"><span style="font-size: 9pt; font-family: simsun;" lang="ZH-CN">以上四步，第一步是得到线程</span></span><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">TEB</span></span><span style="font-size: xx-small; font-family: SimSun;"><span style="font-size: 9pt; font-family: simsun;" lang="ZH-CN">地址，第二步获取</span></span><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">ReservedForOle<span>&nbsp; </span></span></span><span style="font-size: xx-small; font-family: SimSun;"><span style="font-size: 9pt; font-family: simsun;" lang="ZH-CN">指针值，第三步获取套间类型字段。第四步把该字段值和</span></span><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">0x80</span></span><span style="font-size: xx-small; font-family: SimSun;"><span style="font-size: 9pt; font-family: simsun;" lang="ZH-CN">相与，如果不为</span></span><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">0</span></span><span style="font-size: xx-small; font-family: SimSun;"><span style="font-size: 9pt; font-family: simsun;" lang="ZH-CN">，则是</span></span><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">STA</span></span><span style="font-size: xx-small; font-family: SimSun;"><span style="font-size: 9pt; font-family: simsun;" lang="ZH-CN">，否则为</span></span><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">MTA</span></span><span style="font-size: xx-small; font-family: SimSun;"><span style="font-size: 9pt; font-family: simsun;" lang="ZH-CN">。上例结果为</span></span><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">128</span></span><span style="font-size: xx-small; font-family: SimSun;"><span style="font-size: 9pt; font-family: simsun;" lang="ZH-CN">，所以当前线程为</span></span><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">STA</span></span><span style="font-size: xx-small; font-family: SimSun;"><span style="font-size: 9pt; font-family: simsun;" lang="ZH-CN">。然后可以切换到其他线程，重复同样的操作，得到套间类型。</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: xx-small; font-family: SimSun;"><span style="font-size: 9pt; font-family: simsun;" lang="ZH-CN">有一点值得注意的是，如果线程没有与套间关联，则第二步获取的</span></span><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">ReservedForOle<span>&nbsp; </span></span></span><span style="font-size: xx-small; font-family: SimSun;"><span style="font-size: 9pt; font-family: simsun;" lang="ZH-CN">指针值为空，也就无法获取套间类型。</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: xx-small; font-family: SimSun;"><span style="font-size: 9pt; font-family: simsun;" lang="ZH-CN">上述步骤可以归结为一条命令，应用于当前进程的所有线程，并打印结果，如下：</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: xx-small; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">~*e
.if ( poi(@$teb+f80) == 0) { .echo Unknown } .else { .if (
poi(poi(@$teb+f80)+c) &amp; 80 ) { .echo STA } .else { .echo MTA } }</span></span></p><img src ="http://www.cppblog.com/passbian/aggbug/96827.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/passbian/" target="_blank">卞冬华</a> 2009-09-21 10:23 <a href="http://www.cppblog.com/passbian/archive/2009/09/21/96827.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>