- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们正在开发开源 Visual Studio extension用于运行用 C++ 编写的测试 Google Test VS中的框架。用于测试适配器的 VS API 的一部分是可以在附加调试器的情况下运行测试。但是,该 API 不允许获取正在执行的进程的输出:它仅返回进程 ID,而且据我所知,如果进程已经在运行,则无法访问该输出。
因此,我们想启动我们自己的进程,并自行将调试器附加到该进程(遵循 this question 的已接受答案中描述的方法)。到目前为止这是有效的,但我们有一个问题:似乎只有在进程已经运行时才可以附加调试器,从而导致错过断点;原因似乎是在附加调试器之前断点可能已经通过。请注意,我们确实遇到了断点,因此该方法似乎总体上可行,但并不完全可靠。
下面是启动进程的代码(其中 command
是由 Google Test 框架生成的可执行文件):
var processStartInfo = new ProcessStartInfo(command, param)
{
RedirectStandardOutput = true,
RedirectStandardError = false,
UseShellExecute = false,
CreateNoWindow = true,
WorkingDirectory = workingDirectory
};
Process process = new Process { StartInfo = processStartInfo };
process.Start()
DebuggerAttacher.AttachVisualStudioToProcess(vsProcess, vsInstance, process);
下面是附加调试器的实用方法:
internal static void AttachVisualStudioToProcess(Process visualStudioProcess, _DTE visualStudioInstance, Process applicationProcess)
{
//Find the process you want the VS instance to attach to...
DTEProcess processToAttachTo = visualStudioInstance.Debugger.LocalProcesses.Cast<DTEProcess>().FirstOrDefault(process => process.ProcessID == applicationProcess.Id);
//AttachDebugger to the process.
if (processToAttachTo != null)
{
processToAttachTo.Attach();
ShowWindow((int)visualStudioProcess.MainWindowHandle, 3);
SetForegroundWindow(visualStudioProcess.MainWindowHandle);
}
else
{
throw new InvalidOperationException("Visual Studio process cannot find specified application '" + applicationProcess.Id + "'");
}
}
有什么方法可以更可靠地附加调试器吗?例如,是否可以从 C# 启动一个进程,以便该进程在开始执行传递的命令之前等待 1 秒?这会给我们足够的时间来附加调试器(至少在我的机器上 - 我已经通过在 Google Test 可执行文件的 main()
方法中添加 1s 等待时间来测试它,但事实并非如此一个选项,因为我们的用户需要更改他们的测试代码以便能够使用我们的扩展对其进行调试)...或者甚至有一种干净的方法(所描述的方法可能会明显失败,例如在慢速机器上)?
更新:让我们回顾一下问题陈述:我们的用户有一个 C++ 解决方案,包括使用 Google 测试框架编写的测试(这些测试被编译成可执行文件,例如从命令行运行)。我们提供了一个用 C# 编写的 VS 扩展(测试适配器),它发现可执行文件,在 Process
的帮助下运行它,收集测试结果,并将它们显示在 VS 测试资源管理器中。现在,如果我们的用户单击调试测试,我们将启动运行 C++ 可执行文件的进程,然后将调试器附加到该进程。但是,在将调试器附加到进程时,可执行文件已经开始运行,并且已经执行了一些测试,导致这些测试中的断点被遗漏。
因为我们不想强制我们的用户更改他们的 C++ 代码(例如,通过在测试代码的 main()
方法的开头添加一些等待时间,或者使用其中一种方法由下面的 Hans 引用),我们需要一种不同的方式来附加该调试器。事实上,VS 测试框架允许启动一个带有调试器的进程(这种方法不会遇到我们的问题 - 这就是我们现在正在做的),但这种方法不允许获取进程的输出,因为我们得到是已经运行的进程的进程 ID(至少我不知道在这种情况下如何完成 - 我已经对此进行了研究(所以我相信 :-))。获取输出会对我们的扩展有一些显着的好处(我没有在这里列出 - 如果您有兴趣,请在评论中告诉我),因此我们正在寻找一种不同的方式来处理这种情况。
那么我们如何运行可执行文件(包括抓取可执行文件的输出)并立即将调试器附加到它,这样就不会遗漏任何断点?这可能吗?
最佳答案
您可以 PInvoke CreateProcess(参见示例 How to call CreateProcess()...)使用 CREATE_SUSPENDED 创建标志(参见 Creation Flags 了解更多详细信息)启动调试对象,然后 PInvoke ResumeThread 在附加调试器后继续。
您可能需要调整 CreateProcess 的选项,具体取决于您的具体需要,但应该这样做。
更新:一个好得多的选择是使用 IVsDebugger4 接口(interface)来调用 LaunchDebugTargets4,因为您正在编写 VS 扩展。 .该接口(interface)已记录在案,您可以在 GitHub 上找到大量示例(只需搜索 LaunchDebugTargets4)。一旦您附加了 native 调试引擎,此方法将避免 VS 中令人讨厌的中断。
关于C#:以干净的方式将调试器附加到进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38888945/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!