在 Visual Studio 调试会话期间查找当前目录?

Posted

技术标签:

【中文标题】在 Visual Studio 调试会话期间查找当前目录?【英文标题】:Finding current directory during Visual Studio debugging session? 【发布时间】:2009-09-02 13:38:06 【问题描述】:

如何找到 .NET 应用程序的当前目录 在 Visual Studio 调试器下运行?

更新 1。明确一点:我不想更改代码 或在程序本身中获取信息 - 我只想 获取有关当前正在运行的应用程序的信息 已调试。

在调试 .NET Windows Forms 应用程序时(混合 VB.NET 和 C#) 我不确定 XML 文件来自哪个位置 读自。我希望当前目录是 应用程序的目录。但是,使用 Process Explorer, 进程的属性导致:

D:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\

(右键单击进程/属性/选项卡图像/当前目录)。

将光标悬停在进程资源管理器主视图中的进程上 显示了不同的结果(请参阅下面的屏幕截图):

D:\dproj\DTASCall\DTASuperCharge\bin\

什么是正确的?

独立启动应用程序会显示预期的 当前目录,

D:\dproj\DTASCall\DTASuperCharge\bin\

在 Process Explorer 进程属性窗口中。


Process Explorer 的注释屏幕截图:

Alt text http://www.pil.sdu.dk/1/until2039-12-31/PEdiscrepancy_2009-09-02.png

【问题讨论】:

【参考方案1】:

在 Visual Studio 中,在调试选项卡中的项目设置下,您可以根据需要设置“工作目录”。

要在代码中或在断点的立即窗口中确定当前工作目录,请尝试

System.IO.Directory.GetCurrentDirectory()

【讨论】:

对于即时窗口:不是“Debug.Print (System.IO.Directory.GetCurrentDirectory() )”吗? 立即窗口的替代方案:菜单调试/快速观察//按重新评估。或者在常规 Watch 窗口的 Name 列的最后一行输入,然后按 Return 键。 或者在即时窗口中,你总是可以做"?System.IO.Directory.GetCurrentDirectory()" 我使用了这个答案,但将其修改为 "?System::IO::Directory::GetCurrentDirectory()" 以调试 CLI\C++。【参考方案2】:

在你的代码中,调用函数

System.IO.Directory.GetCurrentDirectory()

默认情况下,除非您更改了项目的 Debug 属性,否则当前目录将从项目的 bin\Debug 目录开始(运行 .exe 的位置)。

【讨论】:

实际程序没有运行是什么意思?截屏时程序在断点处停止。 嗯,我明白你的意思了。我对 .vshost 的看法是错误的——我刚刚检查了同样的事情,procexp 可以毫无问题地跟踪我当前的工作目录。尝试比较 System.IO.Directory.GetCurrentDirectory() 的输出 - 与默认项目设置,这应该是应用程序的 bin\Debug 目录。如果您尝试读取的 XML 文件是项目项,请务必将 Build Action 属性设置为“Content”,并将 Copy to Output Directory 属性设置为适当。从应用程序的根目录而不是当前目录读取可能也值得您阅读。 调试页面上的“工作目录”字段为空。但是在编译页面上,“构建输出路径”字段包含“bin\”。它应该是空的吗?该项目由 Visual Studio 于 2003 年创建,从那时起经历了两次 Visual Studio 更新。目前应用从 bin 目录启动,而不是 bin/Debug 听起来不错。对于默认的 C# 项目,输出路径将为 bin\Debug,工作目录字段为空。 启动项目是一个 VB.NET 项目(我从中列出了上面的设置)。【参考方案3】:

最好的方法是在WinDbg(Windows 调试器)中运行应用程序,然后附加到进程并运行!handle 命令。每个打开的文件都有一个关联的句柄。通过转储相应进程的所有句柄,您将看到相应的文件路径。

这是一个例子:

!handle 0 f process-id

将 process-id 替换为您的进程 ID 的值。您还可以使用进程地址代替进程 ID。如果这没有显示文件对象,则文件句柄已经关闭。在这种情况下,您需要跟踪句柄。这可以通过!htrace 命令完成。

【讨论】:

Philip Rieck 下面的帖子是正确答案:“System.IO.Directory.GetCurrentDirectory()”

以上是关于在 Visual Studio 调试会话期间查找当前目录?的主要内容,如果未能解决你的问题,请参考以下文章

调试期间在 Visual Studio 中自动附加到子进程

在 Visual Studio 调试命令参数中转义

译如何在 Visual Studio 中调试异步代码

在 Visual Studio 调试期间从哪里加载 user.config

在 Visual Studio 调试期间无法连接到 Oracle 数据库

如何在调试构建期间使 Visual Studio (2019/2022) 链接到正常的运行时库?