- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
几天前,我在工作中遇到了这个问题,我想知道有没有一种方法可以比从Microsoft那里提取更多的数据。有很多这样的情况,我想探索一下,作为Windows开发人员,获取大多数信息的最佳/最佳方式就是这种情况。我将描述这种情况:
1)办公应用程序在进行某些设置的打印时,涉及cmyk颜色空间,引发对话框错误,描述不正确。“文件%s无法打开,因为它已被其他应用程序锁定”。它既不提供文件名,也不提供事件查看器。打印被中止。
2)在使用“ procmon”时,当涉及的进程(如Office应用,后台处理程序,splwow64.exe)调用api“ CreatefileMapping”时,我们在几个文件上发现“文件锁定错误”(是的是64位系统,应用是32位)。
3)当不涉及splwow64时,问题就不存在,这意味着在64位操作系统上使用64位应用程序。
我想知道在这种情况下哪些工具对获取更多信息有用。这包括在windbg中使用MS符号,并在需要时进行调试程序集。基本上,我需要锁定的文件名,该文件名显示为%s和问题的根源。
谢谢,
考希克
最佳答案
没有源代码和没有符号的调试很困难。所采用的方法因您可以观察到的情况和可以做出的假设而有很大不同。以下内容听起来很符合您的情况。
与32位版本不同的是64位文件访问
由于64位版本有效,因此请查看文件访问的区别。您可以将Process Monitor日志导出为CSV,并编写一个分析文件访问的工具。您的分析工具可能应该
总结对整个文件的单个文件访问具有不同偏移量的多个文件读取访问。
忽略读取顺序,因为顺序似乎不太重要。
首先忽略DLL
也许您甚至可以在Excel本身中执行此操作。
捕获文件访问呼叫
首先,我认为使用Process Monitor已经是一个好方法。您不了解应用程序就知道它在做什么,所以这将是我的首选。
当然,很难缩小问题文件的范围。如有必要,您需要仔细阅读所有内容,例如在批处理文件的帮助下,找到一个命令行工具,该工具可以帮助找到已打开文件的应用程序。在这种情况下,请查看SysInternals Handle。它是一个命令行实用程序,您可以为其指定文件名。基本上,它是Process Explorer的DOS版本(请参见下文)。
读取文件和写入文件通常是通过API调用完成的,因此API Monitor是另一种选择。筛选所有可疑的文件访问方法(ReadFile,ReadFileEx,LockFile,LockFileEx,WriteFile,WriteFileEx等)。
在WinDbg中,也可以通过设置断点来实现,但是您可能经常碰到它们,因此处理它们可能需要一些自动化。您可以为bp
命令指定命令字符串。
好运
可能用作%s
格式字符串的参数的文件名位于内存中的某个位置。
在应用程序显示消息时进行故障转储
使用SysInternals Strings实用程序转储转储的所有字符串。
通过将其通过管道传输到C:\
命令直接为D:\
,find
等输出的过滤器,或者将其重定向到文本文件以供以后分析
这仍然会留下很多文件,因此查找罪魁祸首并不比以前的方法容易得多。再次,使用其他工具缩小列表范围,例如handle
。
在应用程序显示消息时进行故障转储
在WinDbg中打开转储
转储您在堆栈中找到的某些地址的字符串。由于NTFS中的文件名是Unicode,因此du <address>
在这里应该可以正常工作。
这肯定需要更多有关内部内容的知识,例如在哪里找到好的指针等
分析第一次机会异常
如果应用程序依赖异常,则可以通过检查首次机会异常来获得一些见识。但是,如果应用程序进行了良好的前提条件检查,则异常情况将更少,从而降低了获取有用内容的机会。
如果情况重现,则可以
使用Image File Execution Options将WinDbg设置为该进程的调试器。
使用.logopen /t /u c:\firstchanceexceptions.log
打开日志文件
让所有异常都使用sxe -c ".exr -1;k;g" *
转储。该命令中的g
将立即继续,以便应用程序(希望)不会超时。
继续执行g
应用程序终止时,使用.logclose
关闭日志文件
查看日志文件中有趣的异常/有趣的调用堆栈
重现错误,但这次在有趣的异常上停止
查看方法参数和内存是否找到文件名(再次使用du <address>
)
查找属于消息框的应用程序
如果您无法确定哪个应用程序显示错误消息,例如由于邮件标题错误,请执行以下操作:
下载SysInternals Process Explorer并运行它。
将十字线从工具栏拖动到窗口上方。
现在,Process Explorer突出显示拥有窗口的可执行文件
查找锁定应用程序(如果已打印文件名)
如果对话框显示文件名,而不仅仅是“%s”:
也使用Process Explorer
使用查找/查找句柄或DLL或按Ctrl + F
键入文件名或部分文件名
关于assembly - 在没有源代码的情况下对Windows应用程序进行调试/故障排除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23960372/
我喜欢 smartcase,也喜欢 * 和 # 搜索命令。但我更希望 * 和 # 搜索命令区分大小写,而/和 ?搜索命令遵循 smartcase 启发式。 是否有隐藏在某个地方我还没有找到的设置?我宁
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 10年前关闭。 Improve this qu
从以下网站,我找到了执行java AD身份验证的代码。 http://java2db.com/jndi-ldap-programming/solution-to-sslhandshakeexcepti
似乎 melt 会使用 id 列和堆叠的测量变量 reshape 您的数据框,然后通过转换让您执行聚合。 ddply,从 plyr 包看起来非常相似..你给它一个数据框,几个用于分组的列变量和一个聚合
我的问题是关于 memcached。 Facebook 使用 memcached 作为其结构化数据的缓存,以减少用户的延迟。他们在 Linux 上使用 UDP 优化了 memcached 的性能。 h
在 Camel route ,我正在使用 exec 组件通过 grep 进行 curl ,但使用 ${HOSTNAME} 的 grep 无法正常工作,下面是我的 Camel 路线。请在这方面寻求帮助。
我正在尝试执行相当复杂的查询,在其中我可以排除与特定条件集匹配的项目。这是一个 super 简化的模型来解释我的困境: class Thing(models.Model) user = mod
我正在尝试执行相当复杂的查询,我可以在其中排除符合特定条件集的项目。这里有一个 super 简化的模型来解释我的困境: class Thing(models.Model) user = mod
我发现了很多嵌入/内容项目的旧方法,并且我遵循了在这里找到的最新方法(我假设):https://blog.angular-university.io/angular-ng-content/ 我正在尝试
我正在寻找如何使用 fastify-nextjs 启动 fastify-cli 的建议 我曾尝试将代码简单地添加到建议的位置,但它不起作用。 'use strict' const path = req
我正在尝试将振幅 js 与 React 和 Gatsby 集成。做 gatsby developer 时一切看起来都不错,因为它发生在浏览器中,但是当我尝试 gatsby build 时,我收到以下错
我试图避免过度执行空值检查,但同时我想在需要使代码健壮的时候进行空值检查。但有时我觉得它开始变得如此防御,因为我没有实现 API。然后我避免了一些空检查,但是当我开始单元测试时,它开始总是等待运行时异
尝试进行包含一些 NOT 的 Kibana 搜索,但获得包含 NOT 的结果,因此猜测我的语法不正确: "chocolate" AND "milk" AND NOT "cow" AND NOT "tr
我正在使用开源代码共享包在 iOS 中进行 facebook 集成,但收到错误“FT_Load_Glyph failed: glyph 65535: error 6”。我在另一台 mac 机器上尝试了
我正在尝试估计一个标准的 tobit 模型,该模型被审查为零。 变量是 因变量 : 幸福 自变量 : 城市(芝加哥,纽约), 性别(男,女), 就业(0=失业,1=就业), 工作类型(失业,蓝色,白色
我有一个像这样的项目布局 样本/ 一种/ 源/ 主要的/ java / java 资源/ .jpg 乙/ 源/ 主要的/ java / B.java 资源/ B.jpg 构建.gradle 设置.gr
如何循环遍历数组中的多个属性以及如何使用map函数将数组中的多个属性显示到网页 import React, { Component } from 'react'; import './App.css'
我有一个 JavaScript 函数,它进行 AJAX 调用以返回一些数据,该调用是在选择列表更改事件上触发的。 我尝试了多种方法来在等待时显示加载程序,因为它当前暂停了选择列表,从客户的 Angul
可能以前问过,但找不到。 我正在用以下形式写很多语句: if (bar.getFoo() != null) { this.foo = bar.getFoo(); } 我想到了三元运算符,但我认
我有一个表单,在将其发送到 PHP 之前我正在执行一些验证 JavaScript,验证后的 JavaScript 函数会发布用户在 中输入的文本。页面底部的标签;然而,此消息显示短暂,然后消失...
我是一名优秀的程序员,十分优秀!