用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字

IT开发者    -  云代码空间

—— 20141227

Visual Studio在系统DLL调用处暂停

2014-04-05|2086阅||

摘要:有时在DLL的某个函数被调用时暂停是很有用,特别是系统DLL(比如kernel32.dll、user32.dll)。实现这种暂停需要使用原生debugger提供的上下文运算符。你可以设定断点位置、变量名或者表达式: {[函数],[源代码],[模块]}断点位置

有时在DLL的某个函数被调用时暂停是很有用,特别是系统DLL(比如kernel32.dll、user32.dll)。实现这种暂停需要使用原生debugger提供的上下文运算符。你可以设定断点位置、变量名或者表达式:

  • {[函数],[源代码],[模块]}断点位置
  • {[函数],[源代码],[模块]}变量名
  • {[函数],[源代码],[模块]}表达式

大括号内可以是函数名、源代码及模块的任意组合,但是逗号不能省略。

举个例子如果我们需要在CreateThread函数调用时暂停。这个函数是从kernel32.dll导出的,因此上下文运算符应该是这样子的:{,,kernel32.dll}CreateThread。然而,这样并不行,因为该运算符需要CreateThread修饰之后的名字。可以使用  DBH.exe来获得一个特定函数的修饰名(编译器编译生成)。

下面是如何获得CreateThread的修饰名的方法:

01 C:\Program Files (x86)\Debugging Tools for Windows (x86)>dbh.exe -s:srv*C:\Symbo
02 ls*http://msdl.microsoft.com/Download/Symbols -d C:\Windows\SysWOW64\kernel32.dl
03 l enum *CreateThread*
04 Symbol Search Path: srv*C:\Symbols*http://msdl.microsoft.com/Download/Symbols
05  
06  index            address     name
07      1            10b4f65 :   _BaseCreateThreadPoolThread@12
08      2            102e6b7 :   _CreateThreadpoolWork@12
09      3            103234c :   _CreateThreadpoolStub@4
10      4            1011ea8 :   _CreateThreadStub@24
11      5            1019d40 :   _NtWow64CsrBasepCreateThread@12
12      6            1019464 :   ??_C@_0BC@PKLIFPAJ@SHCreateThreadRef?$AA@
13      7            107309c :   ??_C@_0BD@CIEDBPNA@TF_CreateThreadMgr?$AA@
14      8            102ce87 :   _CreateThreadpoolCleanupGroupStub@0
15      9            1038fe3 :   _CreateThreadpoolIoStub@16
16      a            102e6f0 :   _CreateThreadpoolTimer@12
17      b            102e759 :   _CreateThreadpoolWaitStub@12
18      c            102ce8e :   _CreateThreadpoolCleanupGroup@0
19      d            102e6e3 :   _CreateThreadpoolTimerStub@12
20      e            1038ff0 :   _CreateThreadpoolIo@16
21      f            102e766 :   _CreateThreadpoolWait@12
22     10            102e6aa :   _CreateThreadpoolWorkStub@12
23     11            1032359 :   _CreateThreadpool@4

看起来真实的名字是_CreateThreadStub@24。因此我们可以创建断点,{,,kernel32.dll}_CreateThreadStub@24。

Visual Studio在系统DLL调用处暂停 运行程序,当遇到暂停时,直接忽略关于在断点位置无相关源代码的消息提示。

Visual Studio在系统DLL调用处暂停 

使用调用堆栈窗口来查看调用这个函数的代码。

Visual Studio在系统DLL调用处暂停 
顶 0踩 0收藏
文章评论
    发表评论

    个人资料

    • 昵称: IT开发者
    • 等级: 资深程序员
    • 积分: 1060
    • 代码: 87 个
    • 文章: 12 篇
    • 随想: 2 条
    • 访问: 3 次
    • 关注

    最新提问

      站长推荐