上篇博文中给大家分享了使用Windbg分析线程阻塞问题:

Windbg程序调试系列3-线程阻塞问题

本篇中我们继续,跟大家分享附加进程实时调试-Live Debugging。

先说一下使用Windbg附加进程实时调试的应用场景和注意事项

应用场景:

  • 集成测试环境,影响异常后,分析异常和线程上下文的执行堆栈、参数情况;
  • 生产环境:短时间内调试程序异常,查看异常上下文和参数,但是调试时间不能太久。

注意事项:附加进程调试会阻塞请求,调试后新的请求被阻塞住,前端调用受影响,因此要谨慎、权衡利弊,开发测试环境可以,生产环境要谨慎。

附加进程实时调试的套路:

  1. F6 Attache进程
  2. 加载SOS, .loadby sos clr
  3. 启用异常捕获 sxe clr
  4. 运行,捕获&查看异常 g  !pe
  5. 查看异常所在线程堆栈!clrstack, 查看异常所在线程堆栈的参数和变量 !clrstack -a / !dso
  6. 禁用异常捕获 sxd clr
  7. 退出调试 qd

动手实操:

1. F6 Attache进程

打开Windbg,按下F6键,选择要调试的进程,支持输入进程ID:

2. 加载SOS, .loadby sos clr

.loadby sos clr

3. 启用异常捕获 sxe clr

sxe clr

4. 运行,捕获&查看异常 g  !pe

g

上图的输出中,我们发现了以下异常信息:SocketException:远程追究强迫关闭了一个现有的连接

:> !pe
Exception object: 000000d79aedb7a8
Exception type: System.Net.Sockets.SocketException
Message: 远程主机强迫关闭了一个现有的连接。
InnerException: <none>
StackTrace (generated):
<none>
StackTraceString: <none>
HResult:

异常Exception对象的内存地址:

000000d79aedb7a8

5. 查看异常所在线程堆栈!clrstack, 查看异常所在线程堆栈的参数和变量 !clrstack -a / !dso

:> !pe
Exception object: 000000d79aedb7a8
Exception type: System.Net.Sockets.SocketException
Message: 远程主机强迫关闭了一个现有的连接。
InnerException: <none>
StackTrace (generated):
<none>
StackTraceString: <none>
HResult:
:> !clrstack
OS Thread Id: 0x15968 ()
Child SP IP Call Site
000000d7b927ea88 00007ffe61c395fc [HelperMethodFrame: 000000d7b927ea88]
000000d7b927eb70 00007ffe52e68f0f *** WARNING: Unable to verify checksum for C:\Windows\assembly\NativeImages_v4..30319_64\System\47e0be927382f169f5de470fab0ceb7d\System.ni.dll
System.Net.Sockets.NetworkStream.Read(Byte[], Int32, Int32) [f:\dd\NDP\fx\src\net\System\Net\Sockets\NetworkStream.cs @ ]
000000d7b927ebe0 00007ffe53e59c04 *** WARNING: Unable to verify checksum for C:\Windows\assembly\NativeImages_v4..30319_64\mscorlib\5d0c037297cc1a64b52ce43b45c2ac2e\mscorlib.ni.dll
System.IO.BufferedStream.ReadByte() [f:\dd\ndp\clr\src\BCL\system\io\bufferedstream.cs @ ]
000000d7b927ec10 00007ffe53e2183c System.IO.BinaryReader.ReadByte() [f:\dd\ndp\clr\src\BCL\system\io\binaryreader.cs @ ]
000000d7b927ec40 00007ffdf6188eb5 RabbitMQ.Client.Impl.Frame.ReadFrom(RabbitMQ.Util.NetworkBinaryReader)
000000d7b927ecb0 00007ffdf6188e13 RabbitMQ.Client.Impl.SocketFrameHandler.ReadFrame()
000000d7b927ed10 00007ffdf6188cfc RabbitMQ.Client.Framing.Impl.Connection.MainLoopIteration()
000000d7b927ed50 00007ffdf6188a9f RabbitMQ.Client.Framing.Impl.Connection.MainLoop()
000000d7b927edb0 00007ffe53e34740 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) [f:\dd\ndp\clr\src\BCL\system\threading\executioncontext.cs @ ]
000000d7b927ee80 00007ffe53e345d4 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) [f:\dd\ndp\clr\src\BCL\system\threading\executioncontext.cs @ ]
000000d7b927eeb0 00007ffe53e345a2 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) [f:\dd\ndp\clr\src\BCL\system\threading\executioncontext.cs @ ]
000000d7b927ef00 00007ffe53ebcf62 System.Threading.ThreadHelper.ThreadStart() [f:\dd\ndp\clr\src\BCL\system\threading\thread.cs @ ]
000000d7b927f158 00007ffe55325a03 [GCFrame: 000000d7b927f158]
000000d7b927f4a8 00007ffe55325a03 [DebuggerU2MCatchHandlerFrame: 000000d7b927f4a8]

上面的输出中,我们能看到异常所在的线程是32号线程,线程堆栈如下,RabbitMQ的通讯异常(心跳线程连接RabbitMQ Server异常)

继续看线程堆栈的变量:

!clrstack -a
:> !clrstack -a
OS Thread Id: 0x15968 ()
Child SP IP Call Site
000000d7b927ea88 00007ffe61c395fc [HelperMethodFrame: 000000d7b927ea88]
000000d7b927eb70 00007ffe52e68f0f System.Net.Sockets.NetworkStream.Read(Byte[], Int32, Int32) [f:\dd\NDP\fx\src\net\System\Net\Sockets\NetworkStream.cs @ ]
PARAMETERS:
this = <no data>
buffer = <no data>
offset = <no data>
size = <no data>
LOCALS:
<no data>
<no data>
<no data>
<no data>
<no data> 000000d7b927ebe0 00007ffe53e59c04 System.IO.BufferedStream.ReadByte() [f:\dd\ndp\clr\src\BCL\system\io\bufferedstream.cs @ ]
PARAMETERS:
this (<CLR reg>) = 0x000000d79a3c2f18
LOCALS:
<no data>
<no data> 000000d7b927ec10 00007ffe53e2183c System.IO.BinaryReader.ReadByte() [f:\dd\ndp\clr\src\BCL\system\io\binaryreader.cs @ ]
PARAMETERS:
this = <no data>
LOCALS:
<no data> 000000d7b927ec40 00007ffdf6188eb5 RabbitMQ.Client.Impl.Frame.ReadFrom(RabbitMQ.Util.NetworkBinaryReader)
PARAMETERS:
reader (<CLR reg>) = 0x000000d79a3c2f70
LOCALS:
<no data>
<no data>
<no data>
<no data>
<no data>
<no data>
<no data> 000000d7b927ecb0 00007ffdf6188e13 RabbitMQ.Client.Impl.SocketFrameHandler.ReadFrame()
PARAMETERS:
this = <no data>
LOCALS:
<no data>
0x000000d7b927ece0 = 0x0000000000000000
0x000000d7b927ecd8 = 0x000000d79a3c2f70 000000d7b927ed10 00007ffdf6188cfc RabbitMQ.Client.Framing.Impl.Connection.MainLoopIteration()
PARAMETERS:
this (<CLR reg>) = 0x000000d79a3c31b8
LOCALS:
<no data>
<no data> 000000d7b927ed50 00007ffdf6188a9f RabbitMQ.Client.Framing.Impl.Connection.MainLoop()
PARAMETERS:
this (0x000000d7b927edb0) = 0x000000d79a3c31b8
LOCALS:
0x000000d7b927ed8c = 0x0000000000000000
<no data>
<no data>
<no data>
<no data> 000000d7b927edb0 00007ffe53e34740 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) [f:\dd\ndp\clr\src\BCL\system\threading\executioncontext.cs @ ]
PARAMETERS:
executionContext = <no data>
callback = <no data>
state = <no data>
preserveSyncCtx = <no data>
LOCALS:
<no data>
<no data>
<no data> 000000d7b927ee80 00007ffe53e345d4 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) [f:\dd\ndp\clr\src\BCL\system\threading\executioncontext.cs @ ]
PARAMETERS:
executionContext = <no data>
callback = <no data>
state = <no data>
preserveSyncCtx = <no data> 000000d7b927eeb0 00007ffe53e345a2 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) [f:\dd\ndp\clr\src\BCL\system\threading\executioncontext.cs @ ]
PARAMETERS:
executionContext = <no data>
callback = <no data>
state = <no data> 000000d7b927ef00 00007ffe53ebcf62 System.Threading.ThreadHelper.ThreadStart() [f:\dd\ndp\clr\src\BCL\system\threading\thread.cs @ ]
PARAMETERS:
this = <no data> 000000d7b927f158 00007ffe55325a03 [GCFrame: 000000d7b927f158]
000000d7b927f4a8 00007ffe55325a03 [DebuggerU2MCatchHandlerFrame: 000000d7b927f4a8]

能看到部分参数的内存地址,但是很多是no data,这样的话,我们尝试用另一个命令,查询线程上下文中的所有变量信息: 

!dso

:> !dso
OS Thread Id: 0x15968 ()
RSP/REG Object Name
000000D7B927E8D0 000000d79aedb7a8 System.Net.Sockets.SocketException
000000D7B927E948 000000d79aedb7a8 System.Net.Sockets.SocketException
000000D7B927E9A8 000000d79aedb7a8 System.Net.Sockets.SocketException
000000D7B927E9B0 000000d79aedb7a8 System.Net.Sockets.SocketException
000000D7B927E9E0 000000d79aedb7a8 System.Net.Sockets.SocketException
000000D7B927E9F0 000000d79aedb7a8 System.Net.Sockets.SocketException
000000D7B927EA78 000000d79aedb850 System.Text.StringBuilder
000000D7B927EAC0 000000d79aedb850 System.Text.StringBuilder
000000D7B927EAD0 000000d79aedb7a8 System.Net.Sockets.SocketException
000000D7B927EAD8 000000d79aedb7a8 System.Net.Sockets.SocketException
000000D7B927EB20 000000d79aedb7a8 System.Net.Sockets.SocketException
000000D7B927EB30 000000d79a3c2ed8 System.Net.Sockets.NetworkStream
000000D7B927EB60 000000d79a809eb0 System.Byte[]
000000D7B927EB70 000000d799fd1420 System.String
000000D7B927EB78 000000d79aeda2e8 RabbitMQ.Client.Framing.BasicProperties
000000D7B927EB80 000000d79aeda568 System.Byte[]
000000D7B927EBB0 000000d79a017a90 System.Threading.ContextCallback
000000D7B927EBB8 000000d79a3c2f18 System.IO.BufferedStream
000000D7B927EBC0 000000d79a3c2f70 RabbitMQ.Util.NetworkBinaryReader
000000D7B927EBC8 000000d79a3c3ff0 System.Threading.ThreadHelper
000000D7B927EBF0 000000d79aeda0a8 System.String HSF-ServiceState
000000D7B927EBF8 000000d799fd1420 System.String
000000D7B927EC00 000000d79a3c2f70 RabbitMQ.Util.NetworkBinaryReader
000000D7B927EC10 000000d79aeda2e8 RabbitMQ.Client.Framing.BasicProperties
000000D7B927EC20 000000d79aeda2e8 RabbitMQ.Client.Framing.BasicProperties
000000D7B927EC28 000000d79a017a90 System.Threading.ContextCallback
000000D7B927EC30 000000d79a3c6a00 RabbitMQ.Client.Framing.Impl.Model
000000D7B927EC50 000000d79a3c3ff0 System.Threading.ThreadHelper
000000D7B927EC78 000000d79a017a90 System.Threading.ContextCallback
000000D7B927EC80 000000d79a3c2bc0 RabbitMQ.Client.Impl.SocketFrameHandler
000000D7B927EC88 000000d79a3c2f70 RabbitMQ.Util.NetworkBinaryReader
000000D7B927EC90 000000d79a3c3ff0 System.Threading.ThreadHelper
000000D7B927ECB0 000000d79a017a90 System.Threading.ContextCallback
000000D7B927ECC0 000000d79a3c6688 RabbitMQ.Client.Impl.Session
000000D7B927ECC8 000000d79aedb430 RabbitMQ.Client.Impl.Frame
000000D7B927ECD8 000000d79a3c2f70 RabbitMQ.Util.NetworkBinaryReader
000000D7B927ECF0 000000d79a3c31b8 RabbitMQ.Client.Framing.Impl.Connection
000000D7B927ED80 000000d79a017a90 System.Threading.ContextCallback
000000D7B927EDB0 000000d79a3c31b8 RabbitMQ.Client.Framing.Impl.Connection
000000D7B927EDF0 000000d79a3c3f90 System.Threading.Thread
000000D7B927EE48 000000d79a3c3ff0 System.Threading.ThreadHelper
000000D7B927EE50 000000d79a3c4150 System.Threading.ExecutionContext
000000D7B927EE58 000000d79a017a90 System.Threading.ContextCallback
000000D7B927EEE8 000000d79a3c3ff0 System.Threading.ThreadHelper
000000D7B927EEF0 000000d79a3c4150 System.Threading.ExecutionContext
000000D7B927F100 000000d79a3c4018 System.Threading.ThreadStart

线程上下文中所有的变量的内存地址,我们都能看到,接下来看每个对象的信息,大家应该都会用了  !do objectAddress, 如果加载的Mex插件,可以用牛逼的  !do2

:> !do2 000000d79a3c6688
0x000000d79a3c6688 RabbitMQ.Client.Impl.Session
_shutdownLock : 000000d79a3c66d0 (System.Object)
_sessionShutdown : 000000d79a3c6cf8 (System.EventHandler<RabbitMQ.Client.ShutdownEventArgs>)
<CloseReason>k__BackingField : NULL
<CommandReceived>k__BackingField : 000000d79a3c6c50 (System.Action<RabbitMQ.Client.Impl.ISession,RabbitMQ.Client.Impl.Command>)
<Connection>k__BackingField : 000000d79a3c31b8 (RabbitMQ.Client.Framing.Impl.Connection)
<ChannelNumber>k__BackingField : (System.Int32)
m_assembler : 000000d79a3c6790 (RabbitMQ.Client.Impl.CommandAssembler)
:> !do 000000d79a3c6688
Name: RabbitMQ.Client.Impl.Session
MethodTable: 00007ffdf6257888
EEClass: 00007ffdf6264ce8
Size: (0x48) bytes
File: C:\TeldApp\HSF\HSF.Host-BillCM-\RabbitMQ.Client.dll
Fields:
MT Field Offset Type VT Attr Value Name
00007ffe53fd6fd8 System.Object instance 000000d79a3c66d0 _shutdownLock
00007ffdf6250760 ...RabbitMQ.Client]] instance 000000d79a3c6cf8 _sessionShutdown
00007ffe53fd9428 System.Int32 instance <ChannelNumber>k__BackingField
00007ffdf62506c0 ...ShutdownEventArgs instance <CloseReason>k__BackingField
00007ffdf6272e78 ...RabbitMQ.Client]] instance 000000d79a3c6c50 <CommandReceived>k__BackingField
00007ffdf62549a0 ...g.Impl.Connection instance 000000d79a3c31b8 <Connection>k__BackingField
00007ffdf62713b0 ....CommandAssembler instance 000000d79a3c6790 m_assembler

我们继续看Connection对象:000000d79a3c31b8

:> !do 000000d79a3c31b8 
Name: RabbitMQ.Client.Framing.Impl.Connection
MethodTable: 00007ffdf62549a0
EEClass: 00007ffdf6260b78
Size: (0xe8) bytes
File: C:\TeldApp\HSF\HSF.Host-BillCM-\RabbitMQ.Client.dll
Fields:
MT Field Offset Type VT Attr Value Name
00007ffe53fd6fd8 System.Object instance 000000d79a3c32a0 m_eventLock
00007ffdf6257c48 ...Client.Impl.Frame instance 000000d79a3c32b8 m_heartbeatFrame
00007ffe53fe7378 ....ManualResetEvent instance 000000d79a3c32f8 m_appContinuation
400024a instance m_callbackException
00007ffe53954820 400024b ...bject, mscorlib]] instance 000000d79a3c51d8 m_clientProperties
00007ffdf62506c0 400024c ...ShutdownEventArgs instance m_closeReason
00007ffe53ff9a38 400024d c2 System.Boolean instance m_closed
400024e instance m_connectionBlocked
00007ffdf6250760 400024f ...RabbitMQ.Client]] instance 000000d79a3c6750 m_connectionShutdown
00007ffe53953ff0 ...tArgs, mscorlib]] instance m_connectionUnblocked
00007ffdf622f7d0 ...ConnectionFactory instance 000000d79a3c2698 m_factory
00007ffdf6255cb8 ...mpl.IFrameHandler instance 000000d79a3c2bc0 m_frameHandler
00007ffe53ff40a0 c8 System.Guid instance 000000d79a3c3280 m_id
00007ffdf625a5d0 ...nt.Impl.ModelBase instance 000000d79a3c3860 m_model0
00007ffe53ff9a38 c3 System.Boolean instance m_running
00007ffdf6257a48 ....Impl.MainSession instance 000000d79a3c35f0 m_session0
00007ffdf6259050 ...pl.SessionManager instance 000000d79a3c6018 m_sessionManager
00007ffdf6258068 ...RabbitMQ.Client]] instance 000000d79a3c3370 m_shutdownReport
00007ffe53fd5570 c0 System.UInt16 instance m_heartbeat
00007ffe53ff3f28 400025a d8 System.TimeSpan instance 000000d79a3c3290 m_heartbeatTimeSpan
00007ffe53fd9428 400025b b8 System.Int32 instance m_missedHeartbeats
00007ffe53ff4248 400025c ...m.Threading.Timer instance 000000d79a3c61f0 _heartbeatWriteTimer
00007ffe53ff4248 400025d ...m.Threading.Timer instance 000000d79a3c6428 _heartbeatReadTimer
00007ffe53ff4de8 400025e ...ng.AutoResetEvent instance 000000d79a3c33a8 m_heartbeatRead
00007ffe53ff4de8 400025f ...ng.AutoResetEvent instance 000000d79a3c33f8 m_heartbeatWrite
00007ffe53ff9a38 c4 System.Boolean instance m_inConnectionNegotiation
00007ffdf6258e90 a0 ...nsumerWorkService instance 000000d79a3c3448 <ConsumerWorkService>k__BackingField
00007ffe53ff21f0 bc System.UInt32 instance <FrameMax>k__BackingField
00007ffdf625ace0 a8 ...AmqpTcpEndpoint[] instance <KnownHosts>k__BackingField
00007ffe53954820 b0 ...bject, mscorlib]] instance 000000d79a3c5468 <ServerProperties>k__BackingField
:> !do2 000000d79a3c31b8
0x000000d79a3c31b8 RabbitMQ.Client.Framing.Impl.Connection
m_eventLock : 000000d79a3c32a0 (System.Object)
m_heartbeatFrame : 000000d79a3c32b8 (RabbitMQ.Client.Impl.Frame)
m_appContinuation : 000000d79a3c32f8 (System.Threading.ManualResetEvent)
m_callbackException : NULL
m_clientProperties : 000000d79a3c51d8 (System.Collections.Generic.Dictionary<System.String,System.Object>)
m_closeReason : NULL
m_connectionBlocked : NULL
m_connectionShutdown : 000000d79a3c6750 (System.EventHandler<RabbitMQ.Client.ShutdownEventArgs>)
m_connectionUnblocked : NULL
m_factory : 000000d79a3c2698 (RabbitMQ.Client.ConnectionFactory)
m_frameHandler : 000000d79a3c2bc0 (RabbitMQ.Client.Impl.SocketFrameHandler)
m_model0 : 000000d79a3c3860 (RabbitMQ.Client.Framing.Impl.Model)
m_session0 : 000000d79a3c35f0 (RabbitMQ.Client.Impl.MainSession)
m_sessionManager : 000000d79a3c6018 (RabbitMQ.Client.Impl.SessionManager)
m_shutdownReport : 000000d79a3c3370 (RabbitMQ.Util.SynchronizedList<RabbitMQ.Client.ShutdownReportEntry>)
_heartbeatWriteTimer : 000000d79a3c61f0 (System.Threading.Timer)
_heartbeatReadTimer : 000000d79a3c6428 (System.Threading.Timer)
m_heartbeatRead : 000000d79a3c33a8 (System.Threading.AutoResetEvent)
m_heartbeatWrite : 000000d79a3c33f8 (System.Threading.AutoResetEvent)
<ConsumerWorkService>k__BackingField : 000000d79a3c3448 (RabbitMQ.Client.ConsumerWorkService)
00a0 <KnownHosts>k__BackingField : NULL
00a8 <ServerProperties>k__BackingField : 000000d79a3c5468 (System.Collections.Generic.Dictionary<System.String,System.Object>)
00b0 m_missedHeartbeats : (System.Int32)
00b4 <FrameMax>k__BackingField : (System.UInt32)
00b8 m_heartbeat : (System.UInt16)
00ba m_closed : False (System.Boolean)
00bb m_running : True (System.Boolean)
00bc m_inConnectionNegotiation : False (System.Boolean)
00c0 m_id : 000000d79a3c3280 1c8d8e96-0c6a-4c62-84b7-9feb241b67ad (System.Guid)
00d0 m_heartbeatTimeSpan : 000000d79a3c3290 :: (System.TimeSpan)

类似的,其他的内存变量也可以看,帮助我们分析问题。

找到问题的大致原因后,我们需要禁用异常捕获,退出调试,如果直接关闭Windbg,此时附加调试的进程就被强制退出了,一定要注意,请使用下面的指令:

6. 禁用异常捕获 sxd clr
7. 退出调试 qd

sxd  clr
qd

以上就是跟大家分享的附加进程实时调试,总结一下套路:

  1. F6 Attache进程
  2. 加载SOS, .loadby sos clr
  3. 启用异常捕获 sxe clr
  4. 运行,捕获&查看异常 g  !pe
  5. 查看异常所在线程堆栈!clrstack, 查看异常所在线程堆栈的参数和变量 !clrstack -a / !dso
  6. 禁用异常捕获 sxd clr
  7. 退出调试 qd

分享给大家。

周国庆

2018/11/4

Windbg程序调试系列4-Live Debugging的更多相关文章

  1. Windbg程序调试系列5-高CPU问题分析

    上篇博客中给大家分享了使用Windbg进行Live Debugging: Windbg程序调试系列4-Live Debugging 本篇中我们继续,跟大家分享常见的应用程序高CPU使用率问题分析. 先 ...

  2. Windbg程序调试系列-索引篇

    最近整理了一下Windbg程序调试系列的文章,做个了索引贴,方便大家查询.搜索: Windbg程序调试系列1-常用命令说明&示例 Windbg程序调试系列1-Mex扩展使用总结 Windbg程 ...

  3. Windbg程序调试系列3-线程阻塞问题

    上一篇博文给大家分享了使用Windbg分析内存泄露问题: Windbg程序调试系列2-内存泄露问题 本篇我们继续跟大家分享,如何分析解决线程阻塞问题. 从根本上讲,线程阻塞属于程序Hang的一种,其表 ...

  4. Windbg程序调试系列1-常用命令说明&示例

    Windbg程序调试是.Net高级开发需要掌握的必备技能,分析内存泄露.分析高CPU.分析线程阻塞.分析内存对象.分析线程堆栈.Live Dedugging.这个领域可以说一个技能+场景化应用的结合, ...

  5. Windbg程序调试系列2-内存泄露问题

    上篇文章给大家解释了Windbg的基本命令和说明,这一篇给大家介绍内存泄露场景的问题分析. 文章大纲: 描述问题背景和现象 确定问题是否是内存泄露 梳理问题分析思路 动手分析解决 总结 1. 先说问题 ...

  6. Windbg程序调试系列1-Mex扩展使用总结

    最近一直在频繁使用Windbg做线上Dump调试,与微软做Case交流的时候,发现微软CSS团队,用了一个非常效率的Windbg 插件,Mex: 使用介绍: https://blogs.msdn.mi ...

  7. Windows程序调试系列: 使用VC++生成调试信息 转

    Windows程序调试系列: 使用VC++生成调试信息 ZhangTao,zhangtao.it@gmail.com, 译自 “Generating debug information with Vi ...

  8. Windbg程序调试--转载

    WinDbg是微软发布的一款相当优秀的源码级(source-level)调试工具,可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件. WinDbg是微软很重要的诊断调试工具: 可以查 ...

  9. .NET高级调试系列-Windbg调试入门篇

    Windbg是.NET高级调试领域中不可或缺的一个工具和利器,也是日常我们分析解决问题的必备.准备近期写2篇精华文章,集中给大家分享一下如果通过Windbg进行.NET高级调试. 今天我们来一篇入门的 ...

随机推荐

  1. Python数据分析基础教程

    Python数据分析基础教程(第2版)(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1_FsReTBCaL_PzKhM0o6l0g 提取码:nkhw 复制这段内容后 ...

  2. Telephone Lines [POJ3662] [二分答案]

    Description Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N ...

  3. php获取文章的第一张图片

    今天做东西的时候遇到一个问题就是如何把文章提取出来作为文章列表呢? 因为用了Ueditor,所以提交的数据包含了html标签. 搜索了一会找到了一个方案,用php自带的函数去掉了html标签. $ar ...

  4. linux学习:文件处理相关命令用法整理(正则表达式)

    指令:ls.cat.du.rename.dirname.basename.sort.diff.seq.head.tail.tree.chmod.cut.paster.正则 一:统计文件大小,行数,字符 ...

  5. CSS预编译语言-LESS

    LESS的作用 CSS层叠样式表,它是标记语言,不是编程语言:所有的预编译CSS语言(less/sass…)都是赋予了CSS的面向对象思想 LESS的编译 LESS叫做预编译CSS:写好的LESS代码 ...

  6. 解决archlinux下QT程序,以及wineQQ无法输入中文(.xinitrc)

    昨天安了i3wm,发现fcitx在很多程序中无法输入中文,nixnote2,还有ss-qt5 查了wiki,明明有在~/.xinitrc中加入 export XMODIFIERS=@im=fcitx ...

  7. Python3.6 提示 ModuleNotFoundError: No module named '_ssl' 模块问题

    国内 163 yum 源挺好用 (中科大的也不错) http://mirrors.163.com/.help/CentOS6-Base-163.repo yum install openssl-dev ...

  8. jmeter数据库连接配置

    一.实际试过的mysql配置 1.导入一个JDBC jar包(我是直接把jar包放在了jmeter的lib目录),包:mysql-connector-java-5.1.7-bin.jar 2.设置JD ...

  9. csv impor export with mysql

    server-side:SELECT id,tutorialId,tutorialName,ucreatelink,structureVersion FROM base_courseINTO OUTF ...

  10. 审核被拒Guideline 2.1 - Information Needed we are unable to find 账号登录 option

    Guideline 2.1 - Information Needed We were unable to sign in to review your app with the demo accoun ...