tct 命令在后台是如何工作的?

问题描述

windbg 命令 tct 执行程序,直到到达 If ListBox1.Selectedindex > -1 Then For Each Item As Object In ListBox1.SelectedItems Dim ItemSelected = CType(ListBox1.SelectedItem.Item("Path"),String) SearchFolder = ItemSelected Dim dirInfo As New IO.DirectoryInfo(SearchFolder) Dim files As IO.FileInfo() = dirInfo.GetFiles() Dim file As IO.FileInfo docImage = (ImageList1.Images.Count - 1) Dim items As New List(Of ListViewItem) For Each file In files Dim filename As String = file.Name.ToString If file.Extension = ".pdf" Then foundList = PDFManipulation.GetTextFromPDF2(SearchFolder + filename,SearchRegX) If foundList = True Then items.Add(New ListViewItem(New String() {"",filename.ToString},docImage)) End If End If Next ListView1.Items.AddRange(items.ToArray) Next End If 指令或 call 指令。我想知道调试器如何在幕后实现此功能

我可以想象调试器从当前指令扫描下一个 retcall 的指令,并根据找到的指令设置断点。但是,我认为这不太可能,因为它还必须考虑 ret 指令,以便有任意数量的可能的 jmpcall 指令,这样的断点必须设置。

另一方面,我想知道 x86/x64 cpu 是否提供了一种功能,当 cpu 即将处理 retcall 指令时,该功能会引发异常以供调试器捕获。然而,我还没有听说过这样的功能

解决方法

我猜它会重复单步执行,直到下一条指令是 call 或 ret,而不是试图找出在哪里设置断点。 (在一般情况下,这可能与解决停机问题一样困难。)

通过向前扫描“直线”代码并在下一个 Selenium/jmp/jcc 或其他控制转移指令(例如loop),并捕获可以将控制权转移到 SEH 处理程序的信号/异常。

我也不知道有任何硬件支持中断某种类型的指令或操作码:the x86 debug registers DR0..7 允许在代码地址处设置硬件断点,而无需将机器代码重写为 xabort,还有硬件观察点(将数据加载/存储捕获到特定地址或地址范围)。但不是按操作码过滤。