在调试ArcGIS 10外接程序时,为什么断点不会被“命中”?


24

我不时遇到以下问题:

我开始调试加载项,并且断点将被忽略。IDE和组件之间的通信似乎几乎无法正常工作。

我的问题是,上一次发生这种情况后,我解决了它,现在我不记得自己做了什么修复。

断点当前不会被命中。没有为文档加载任何符号。 在此处输入图片说明

在某种程度上,这里已经描述我遇到的问题,但是对于实际的断点故障没有解决方案。

请注意,这通常有效。

删除bin和obj似乎无效。

这次我只是从备份中还原了整个项目并重新开始,但是我想知道如何解决这个问题,如果我再次遇到这个问题。


1
配置文件中的“ onDemand” xml属性是否设置为false?
Kirk Kuykendall

我没有明确的答案(尽管通常这意味着调试器无法找到已加载dll的pdb文件),但是您可以尝试在SO上筛选这些问题,以查看它们是否朝着正确的方向发展。
迈克尔·托德

@柯克,我在config.esriaddinx文件中看不到这样的属性。
Jakub Sisak GeoGraphics

@Michael-谢谢。会仔细看看。问题是我可以在几个月内向我的外接程序添加功能,然后愉快地调试一下,突然断点不起作用……
Jakub Sisak GeoGraphics

2
我也曾无缘无故地发生过几次。如果我还记得,删除obj和bin目录可以解决几次,将可疑的pdb和dll复制到当前项目的bin目录中可以工作几次,等等。我无法指出的是,每次都可以,虽然。祝好运。
迈克尔·托德

Answers:


16

这是ESRI员工提供的非官方且未经测试的解决方案。(他们确实强调这不是官方解决方案)

尝试从bin目录中的arcmap.exe.config中删除。

这是\ ArcGIS \ Desktop10.0 \ bin \ arcmap.exe.config xml文件。

在此处输入图片说明


3
实际上,它在这里是“文档化”的resources.arcgis.com/en/help/arcobjects-net/conceptualhelp / ...我在编码ogr-workspace插件时遇到了这个问题,最终将其放在开发人员常见问题解答github.com/中RBURHUM / arcgis-ogr
Ragi Yaser Burhum 2012年

这解决了这个问题对我以及我有我的另一个问题Debug.WriteLine()的消息不被发送到输出窗口在VS 2010
GeoSharp

我再次遇到这个问题,这是这次的工作。我正在运行VS 2010 Express(C#),目标是.NET 4.0。我必须取消对v4.0支持的运行时版本的注释,并删除v2.0参考。
雷达

8

2年和2版本之后,这仍然是一个问题。刚刚完成了对我的10.2版所有插件的更新/改进,再次遇到了这个问题。在这篇文章中实现了所有建议,但没有任何效果,但是我发现了另外一个可能的问题。不幸的是,我不确定这是否是罪魁祸首,因为我也同时实现了其他大多数可能的修复程序。

新发现:我意识到自版本10起,我就一直在同一台机器上开发Addins,并且在重新安装后并不总是清除旧版ArcGIS数据。我发现在C:\ Program Files(x86)\ ArcGIS中的ArcGIS数据的早期版本中,有一个较旧的“罪魁祸首”插件。由于ArcGIS将加载旧版加载项,因此可能存在某种冲突。我删除了所有旧版arcgis应用程序数据(Desktop10.0,Desktop10.1),仅留下Desktop10.2,并且断点栩栩如生。同样,如果这是解决方案,我不是100%,但可能是列表中要检查的另一项。

我已经在另一个站点上看到这个特定的问题被称为“最终的生产力杀手”,我对此表示同意。

总结一下,这是我当前针对“死”断点问题的待办事项清单:

  1. 确保,我实际上正在运行插件。调试器无法启动应用程序-断点将显示为“死”,直到我运行插件(按钮,菜单选项等)为止

  2. 从项目目录中删除OBJ和BIN推子。

  3. 删除assebmly chache的内容:C:\ Users \ User \ AppData \ Local \ ESRI \ Desktop10.2 \ AssemblyCache

  4. 删除所有旧的装配体数据。(如果当前版本为10.2,请删除Desktop10.0,Desktop10.1组装数据)没有证据表明这有帮助或是问题的一部分,但没有理由需要此数据,因此我删除它是为了以防万一(C :\ Users \ User \ AppData \ Local \ ESRI)

  5. 根据ESRI的支持建议;更改ArcCatalog和ArcMap配置XML(当我尝试时本身无法正常工作,但是有人建议将其作为解决方案,包括ESRI支持)。在C:\ Program Files中找到ArcCatalog.exe.config和ArcMap.exe.config( x86)\ ArcGIS \ Desktop10.2 \ bin在记事本中打开每个xml并删除该行<supportedRuntime version="v2.0.50727"/> 这大约是第五行

  6. 从安装目录中删除所有旧版ArcGIS应用程序数据。这对我有用。(可能)转到:C:\ Program Files(x86)\ ArcGIS删除Desktop10.x的所有文件夹(当前文件夹除外)(即Desktop10.0,Desktop10.1),仅当前的Desktop版本应保留在该位置。

  7. 删除并重新添加所有项目引用,包括非ESRI引用,重新保存,重复步骤2和3,重新编译,运行dbugger。

  8. 重新启动计算机。(过去曾有过这样的工作)也发现这是Stack Overflow上推荐的解决方案之一。

  9. 在Config.esriaddinx中-更改按钮以包含onDemand = false :(柯克的建议-参见上文),这对我个人而言不起作用。

  10. 从头开始重建项目。(过去这对我有用。)


Jakub,我有一个类似但不相关的问题gis.stackexchange.com/questions/155016/…-事实证明,遗产也是一个问题。.net框架版本不是最新的,因此,如果您尝试了所有这些版本,但仍无法正常工作,请通过链接查找另一种可能性。
Michael Stimson

5

我唯一得到的时间是当我打开另一个ArcMap实例并忘记在构建/调试之前将其关闭时。如果您没有关闭使用该程序集的所有实例,那么旧的实例将继续使用。或类似的东西。


我尝试在不打开任何其他ArcMap实例的情况下重新启动VS并重新启动计算机并运行调试器。它按照常规方式启动了ArcMap,但“死点”问题仍然存在。
Jakub Sisak GeoGraphics

所以我只是在另一台机器上安装了ArcGIS和Visual Studio(全部全新安装),并且同一件事再次开始发生。我尝试了每个人的建议,您似乎是对的。我确保杀死所有打开的ArcGIS进程,并且在这样做时可以使用断点。
Jakub Sisak GeoGraphics

5

由于项目的.NET Framework为4.0,因此我将其更改为supportedRuntime version="v4.0.30319"ArcMap.exe.config,并注意到此更改延迟了该问题。我还记得ArcMap也可以加载ArcCatalog,所以我也将ArcCatalog.exe.config更改为 supportedRuntime version="v4.0.30319"和YES!再次正常工作。我整天都在尝试解决此问题,希望它也对您有用。


1
我还必须删除bin和obj文件夹。
萨宾·科拉罗夫

4

我尝试了一段时间以上建议,最后找到了解决方案。紧追其后,我将首先给出解决方案,然后给出解释:

  1. 打开任务管理器。结束ArcMap.exe的任何副本。

  2. 打开Windows资源管理器。导航到C:\ Users \\ Local Settings \ ESRI \ Desktop10 ..

  3. 如果看不到AssemblyCache,请组织>文件夹和搜索选项>视图>取消选中“隐藏受保护的操作系统文件(推荐)”

  4. 在AssemblyCache的目录中,查找包含.dll的目录。

  5. 删除.dll。

  6. 重建项目并调试。加载项激活后,您应该会看到缓存内容得到刷新。

  7. 如果需要,请重新隐藏受保护的OS文件。

对我来说,问题在于C:\ Users \\ Local Settings \ ESRI \ DesktopX.X \ AssemblyCache \文件夹中存在我的DLL的旧实例,并且我也看不到\ AssemblyCache,因为我没有意识到这是一个隐藏的OS文件。还有一个正在运行的ArcMap僵尸实例,当我最初尝试删除DLL时,它已被锁定。我的怀疑是,首先导致问题的原因是,在重新编译代码并启动另一个代码之前,我没有完全关闭ArcMap的调试会话。缓存中的旧DLL无法覆盖,因为旧的ArcMap实例仍将其锁定,并且一旦与新代码不同步,缓存的版本就不再更新。(我可以通过文件日期看到正在更新.config,.pdb和.xml,而不是.dll。)


是的,这听起来像是正确的解决方法。
Jakub Sisak GeoGraphics 2013年

2

我正在处理相同的问题,但在其他主题中使用了自己的加载项,因此提出了以下内容:

首先,启动调试,然后在菜单中选择以下窗口调试>> Windows >>模块,您可以在其中查看调试启动时加载了哪些模块。如果您在此处看不到yourAddIn.dll,那么至少您知道它没有被Studio加载。如果您看到那里并且无法在此处放置断点,则Studio加载了一个旧的。要检查这一点,请在项目属性中更改程序集的名称,重新生成解决方案,开始调试,然后您将看到旧的dll加载在那里。我不知道工作室从哪里加载这个旧的dll。

转到解决方案资源管理器并检查比较“ yourAddIn.Addin”和“ yourAddIn-用于Testing.AddIn”文件,它们可能有所不同。Studio在其插件管理器中仅使用第二个文件!第一次更改还要更改其中的标签以引用正确的dll,您也可以检查该标签。对我来说,在“ yourAddIn-For Testing.AddIn”文件中将其设置回0,所以我将其更改回1。您想从加载项列表中删除此加载项!此时Studio将LoadBehavior设置为0。)

这两个更改之后,它又开始工作了!


感谢您分享您的经验,并乐意为我们提供详细信息。欢迎来到我们的社区!
ub

2

使用Visual Studio,我为Arcmap创建了一个新的加载项,并向其中添加了一个按钮和一个工具栏。生成的配置文件如下所示:

<ESRI.Configuration xmlns="http://schemas.esri.com/Desktop/AddIns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Name>ArcMapAddin4</Name>
  <AddInID>{b6b350bb-084d-42b8-a44a-6dbb6a9f5906}</AddInID>
  <Description>Type in a description for this Add-in.</Description>
  <Version>1.0</Version>
  <Image>Images\ArcMapAddin4.png</Image>
  <Author>Kirk</Author>
  <Company>Microsoft</Company>
  <Date>8/15/2011</Date>
  <Targets>
    <Target name="Desktop" version="10.0" />
  </Targets>
  <AddIn language="CLR" library="ArcMapAddin4.dll" namespace="ArcMapAddin4">
    <ArcMap>
      <Toolbars>
        <Toolbar id="MyToolbar4" caption="MyToolbar4" showInitially="true">
          <Items>
            <Button refID="Microsoft_ArcMapAddin4_Button1"/>
          </Items>
        </Toolbar>
      </Toolbars>
      <Commands>
        <Button id="Microsoft_ArcMapAddin4_Button1" class="Button1" message="Add-in command generated by Visual Studio project wizard." caption="My Button" tip="Add-in command tooltip." category="Add-In Controls" image="Images\Button1.png" />
      </Commands>
    </ArcMap>
  </AddIn>
</ESRI.Configuration>

我在Button的构造函数中创建了一些代码,并在其中添加了一个断点。我以调试模式启动,看到程序集尚未加载:

在此处输入图片说明

我将按钮更改为包括onDemand = false:

在此处输入图片说明

当我再次启动arcmap时,它达到了断点。请注意,如果工具栏在启动时处于关闭状态,则需要使其可见以使按钮构造函数被调用-因此在某些方面它仍处于需求状态。


谢谢@柯克。由于我已经从备份中还原了项目,因此现在看来可以正常工作了。我通常会调试一个更进一步的过程。也就是说,即使是点击一次按钮,也是如此。我很确定这时程序集已经加载。(或者应该是,但不是出于某种原因)我肯定会在下次发生这种情况时尝试此解决方案。
Jakub Sisak GeoGraphics

2

必须更改arcCatalog的插件,以使用框架4与新的10.1版ArcCatalog进行匹配。
刚刚注释掉了版本=“ v2.0.50727”,而未注释“ v4.0.30319”

在C:\ Program Files(x86)\ ArcGIS \ Desktop10.1 \ bin中,将ArcCatlog.exe xml配置文件

现在在断点处停止

似乎与arcmap相同


2

将ESRI ArcGIS 10项目从一台计算机迁移到另一台计算机后,遇到错误,该计算机无法为ArcMap.exe加载调试.pdb文件。我在这个帖子上尝试了所有建议,但没有任何运气。

然后,我执行以下操作:

我删除了包含它们的每个项目中所有Esri。*库的引用,然后将它们重新添加到新计算机上的项目中。

这终于对我有用。如果有人在这个模糊的问题上迷路了,并且尝试了此页面上列出的所有其他内容,请尝试执行此操作-快速,简单且无害。我不完全确定为什么必须这样做,我猜测这与在每台计算机上查找库有关。

这是针对使用BaseCommands / Toolbars的项目,而不是新的外接程序。在Windows 7 Pro上将ArcGIS 10.0和.NET 3.5与Visual Studio 2010一起使用。


2

对于那些针对.Net 4.0 Framework的用户,以下对我有用。

  1. 按照许多建议,将ArcMap.exe.config和ArcCatalog.exe.config修改为目标4.0框架
    <?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0.30319"/> <!--supportedRuntime version="v2.0.50727"/--> </startup>
    出于某种原因,ArcCatalog.exe.config似乎已锁定,无法修改。我通过在其他目录中复制和修改它,然后替换它来解决它。
  2. 然后在Config.esriaddinx中将Addin语言更改为 "CLR4.0"

1

我想到两个可能的原因:

  1. 插件未正确注册,因此DLL不会加载到正在调试的ArcMap进程中。

  2. 您的项目以.NET 4为目标。请尝试以.NET 3.5为目标。


面向.Net 3.5。我只是不明白为什么一切都会正常运行,而突然之间却无法正常运行。
Jakub Sisak GeoGraphics

1

如果在同一个Visual Studio解决方案中使用多个项目进行编码,则可能会遇到Visual Studio(VS)“禁用”断点且无法单步执行代码的情况。这是最近发生的事情,我无法进入从主项目中调用的“依赖” DLL程序集项目。

VS警告表明我的程序集(DLL)已过时且与我的代码不完全匹配。有VS选项可以关闭代码匹配的要求,但是从直观上讲,这似乎是一个坏主意,并且得到了Internet帖子的支持。我阅读了许多网站,并且那里有一些过时的建议。

最后,我从从属计算机上搜索了输出DLL,并在计算机上的不同位置找到了几个旧副本(可能是来自较早的实验和项目配置)。所以我删除了所有这些,并从头开始重建我的解决方案。这解决了我的问题。我想我当前的项目无意中绑定到了一个旧副本,并且没有使用放置在调试文件夹中的最新版本。


1

对我有用的方法不是按照上述Jakub的帖子中所述删除arcmap.config.exe,而是将此文件中的“ supportedRuntime”标记设置为您在Visual Studio中定位的Framework的正确版本,我的情况是:

<startup>
    <supportedRuntime version="v3.5"/>
</startup> 

1

在多个ArcObjects项目中,我汇总了调试可能不适用于加载项,扩展名和命令(预加载项)的原因列表。没有特别的顺序:

  1. 您处于Visual Studio的发布模式,而不是调试模式
  2. 该工具的旧版本仍在ArcMap / ArcCatalog中注册,它们阻止了调试版本的加载,或者注册了其他同名工具
  3. 项目/解决方案需要清理,如有必要,请进入\ bin和\ obj并删除所有残留文件
  4. 在某些情况下,只能在激活工具后按需命中断点(按需)
  5. 如果没有命中断点,则可能在构造函数中发生异常,该工具将永远无法运行。通过在调试菜单中显示所有CLR异常进行检查
  6. C:\ Users \ <名称> \ Local Settings \ ESRI \ DesktopX.X \ AssemblyCache中的条目需要删除

许多步骤要求重新启动ArcMap。如果所有其他方法均失败,则重新启动计算机很容易,但我只做过一次。



0

我曾经一两次发生这种情况。如果我没记错的话,我在进行较小的代码更改时就能够使断点正常工作,这意味着应用程序已重建。构建或重建项目时会发生什么?


我尝试重建项目并进行了一些更改,但断点仍然“死了”……
Jakub Sisak GeoGraphics

0

我不敢相信会有更多的人没有这个问题。现在,几乎每次我在改进和调试加载项时都会遇到此问题。

上述解决方案均无效。要解决此问题,我需要删除整个项目并从备份中还原它。这使我相信特定项目中的某些东西已经损坏,因为它通常是在调试期间ArcMap崩溃时开始发生的。


是否有缠绵的ArcMap.exe进程?有时,加载项,扩展,命令等可能会占用资源,或导致竞争状况,从而阻止ArcMap完全退出。
blah238 2011年

没有ArcMap.exe进程正在运行。我现在收到ESRI工作人员答复,要求尝试从bin目录中的arcmap.exe.config中删除<supportedRuntime version =“ v2.0.50727” />。但是,我不确定从哪里删除该项目,而我刚刚从备份中恢复了我的项目,它现在可以工作了。当我更多地了解此修复程序时,我将在调试过程中使ArcMap崩溃,这通常会使这种情况发生,并将尝试一下。
Jakub Sisak GeoGraphics

0

您是否正在使用Framework 4创建项目?我遇到了同样的问题,但是当我切换到Framework 3.5时,它可以正常工作。


0

尝试清理并重建,然后在不调试的情况下运行,当应用程序运行时,将其附加到VS中


0

我知道这听起来似乎太明显了,但是无论如何我都会提到这是您需要适当版本的Visual Studio。例如,给定年份的速成版可能会出现此问题,而最终版可能会出现此问题。如果您使用的是2010年,请尝试切换到2012年。然后尝试从Express切换到Ultimate。如果您还没有解决符号加载问题,我会这样做。ESRI确实提供了有关将符号下载到缓存的信息,如上面的链接所述(ArcObjects 10 .NET SDK帮助)。但是,这可能不是必需的。调试之前,请确保还使用适当的.net框架,例如,旧版本上的.net 3.5。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.