- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果您有一套干净的 Delphi 代码,并且所有线程都是使用 TThread 创建的,您可以在构造函数方法 (TThread.Create) 中设置断点并找出谁创建了您的线程。您甚至可以尝试使用 Delphi TThread 对象中内置的功能来命名所有线程,该功能允许您为每个线程设置调试名称。
但是,如何识别持久的、难以找到的额外线程,这些线程仍然是匿名的(没有调试名称),并且在应用程序启动时出现在模块初始化期间。我可以单步执行模块初始化,但我无法确定可能创建线程的所有源模块(尤其是已完成的 900 多个模块初始化部分),而且我还没有找到一种方法添加一条调试消息(使用断点属性和消息),该消息将在初始化时转储每个单元名称。创造性地使用 System.pas 中设置的断点和日志记录消息使我可以在调试简单的应用程序时做一些事情,但是我的应用程序变得越复杂,我就越感觉被线程蒙蔽了双眼,这两个线程都是在中间创建的应用程序运行时的应用程序,以及在模块初始化时创建的应用程序(即在您进入项目 dpr 中的第一行代码之前)。
我想知道您可能发现了哪些先进技术来识别和找出谁创建了特定线程。如果我们使用像 GDB 这样的调试器,而不是像 Delphi IDE 中内置的 delphi 调试器内核(Turbo Debugger?)这样的调试器,我认为我们可以在像 BeginThread 本身这样的 Windows api 函数上设置断点。但我认为我无法在 Delphi 中做到这一点。
更新:我不知道您可以在 windows.pas 的实现部分为外部 Windows DLL(如 kernel32.dll)设置断点。
更新2:看来David H的答案是通用的最佳想法。我还在研究我现在正在编写的一个小帮助程序代码库,它维护以前见过的线程 ID 字典,并根据创建时间(什么函数)将一些调试名称分配给其他未命名的线程我们在注意到新线程存在之前就调用了)。我认为这将帮助我缩小 40 多个编号线程的范围,以便它们都得到命名,即使其中一些是在外部 C/C++ dll 中或由 COM 进程创建的。
最佳答案
我可能会考虑使用类似 Process Explorer 的工具和 madExcept ,但是有很多工具可以提供帮助。
我不相信 Delphi 使用 Turbo Debugger。更重要的是,Delphi 完全能够在像 CreateThread 这样的 kernel32 入口点上设置断点。
我将在启用调试 DCU 的情况下运行,并在 Windows.pas 中的 CreateThread 实现上设置断点。中断后,切换到 CPU 窗口并进入例程。您将看到 JMP DWORD PTR [address]
指令。跳过这个,嘿,你现在正在 kernel32 中进行调试。您可以在此处设置断点。
现在,如果您重置应用程序并再次开始调试,您将中断源自您进程的所有对 kernel32.CreateThread 的调用。检查调用堆栈将告诉您如何到达那里。它看起来像这样:
最后,我不确定为什么您对应用程序创建线程感到困扰。大多数大小合适的应用程序都会创建大量线程 - 这样做是完全正常的。您遇到什么问题?
关于multithreading - 如何找出 Delphi 程序中所有线程的创建者是谁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4855638/
找出/计算符号的宽度 panel.add(textfield,BorderLayout.SOUTH); system.out.println(textfield.getWidth()); System
嘿,所以我正在制作一个因式分解程序,我想知道是否有人可以给我任何想法,让我知道如何找到一个有效的方法来找到两个数字乘以指定数字的倍数,以及添加到指定数字。 例如我可能有 (a)(b) = 6 a +
我以以下方式将 GWT 方法导出到 native javascript: public class FaceBookGalleryEntryPoint implements EntryPoint {
通常,当您在 Web 上找到 Silverlight 代码示例时,它可能只包含一段代码,而不是使其工作所需的完整代码集。当我试图确定在 xaml 文件顶部使用什么命名空间和/或程序集声明时,这让我感到
我对 Dojo 工具包有点陌生。有些问题我想得到启发(我用谷歌搜索,但没有得到任何合适且令人满意的答案) 我已经在运行的应用程序(由另一个软件开发人员开发)中有一个 dojo.js(也许是下载的未压缩
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: How to detect which row [ tr ] is clicked? 我有一个这样的表:
我目前正在尝试找出特定应用程序使用的数据保护类别。 我的第一个方法是使用未加密的 iTunes 备份来确定所使用的保护类别。我用过this提取备份。但现在我要陷入困境了。 此外,我不太确定 iTune
我有一个 NSRangeException 错误,该错误并不总是发生(尤其是在调试时)。它是随机出现的,我无法弄清楚它来自哪里。我有很多数组操作,因此很难以这种方式消除它。 我的问题是我是否可以从调试
我有一个控制台程序,它链接到 Mac 上的 Foundation 框架。如何找到可执行文件所在的文件夹? 最佳答案 即使该工具不在 bundle 中,您仍然可以使用一些 NSBundle 方法。例如:
简单的问题是:如何找出 Cocoa 应用程序中可执行文件的位置。 请记住,在许多类 Unix 操作系统中,人们使用 PATH 环境来为其可执行文件分配首选位置,特别是当他们的系统中有同一应用程序的多个
如何找出 TGridPanel 内控件的位置(行和列索引)?我想对按钮数量使用常见的 OnClick 事件,并且需要知道按钮的 X、Y 位置。 我使用的是 Delphi 2007。 最佳答案 不幸的是
我试图找到一种方法来确定 .NET 应用程序中任意文件夹中的总磁盘空间和可用磁盘空间。文件夹中的“总磁盘空间”和“可用磁盘空间”是指如果您对其执行“dir”命令,该文件夹将报告的总磁盘空间和可用磁盘空
我希望能够通过 shell 脚本判断任何 POSIX 系统上是否存在命令。 在 Linux 上,我可以执行以下操作: if which ; then ...snip... fi 但是,Solar
如何找到不同 Haskell 函数的复杂性(以 big-O 表示)? 例如, subsequences 的复杂度是多少? ? 最佳答案 您只能通过查看代码来计算函数的确切复杂度。但是,您可以使用 cr
我试图找出我的对象占用了多少内存来查看有多少对象最终出现在 Large Object Heap 上。 (超过 85,000 字节)。 是否像为每个对象添加 4(表示 int)、添加 8(表示 long
一旦我在 Vim 中加载任何文件,它就会尝试检测该文件,并在可能的情况下用颜色突出显示它。 我想知道一个 Vim 命令,它会告诉我 Vim 认为哪个 ftplugin 或文件类型插件/文件类型会突出显
是否有可能找出 querySelector 的哪一部分与 DOM 中的特定元素匹配? 假设您有以下查询: 'h1,h2,h3,h4.custom-bg,div' 如果您使用 document.quer
我遇到一个问题,用户设置的区域设置(德语)与安装的语言 Windows(英语)不同。有没有办法发现安装的 Windows 语言与用户设置的区域设置?我应该注意的问题是我正在创建共享,并且根据区域设置设
我正在写入应用程序中的文件。我想找到该文件以检查该文件是否已正确写入(以便我可以通过 Web View 访问该文件)。这是我用来编写文件的代码: try { FileOutputStream
我有一个从 JSON 文件填充的 HashMap。键值对中的值可以是两种不同的类型 - 字符串或其他键值对。 例如: HashMap hashMap = new Map(); JSON 文件看起来有点
我是一名优秀的程序员,十分优秀!