在VSCode中调试之前启动程序

时间:2016-01-26 10:50:23

标签: debugging visual-studio-code

我正在使用VSCode 0.10.6进行C ++编程。我想在调试之前启动一个程序。程序OpenOCD是GDB连接的。如果我通过终端手动打开和关闭它,它工作正常,但似乎应该有一个简单的方法让VSCode为我启动它。

我玩过tasks.json,看来你需要使用一些丑陋的bat / sh文件来与launch.json中的preLaunchTasks结合使用。

1 个答案:

答案 0 :(得分:0)

目前答案是你必须确实使用preLaunchTasks才有机会完成这项工作。我会很乐意使用一个丑陋的剧本,如果确实可行 - 但它并没有。就我而言,我需要在后台运行一个或多个可执行文件,允许VSCode继续进行调试。

不幸的是,我尝试启动的每个可执行文件(通过start)实际上并没有作为"分离的"进程,因此VSCode将等待每个可执行文件完成运行,然后才能完成preLaunchTasks并开始调试。不是我想要的。

我发现了an article by someone having a similar "detached process" problem with subversion,我用他的C ++代码用Visual Studio Code解决了同样的问题。我在该代码中发现了一两个错误,我修复了这个错误。以下是我目前正在使用的内容:

// dstart.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <windows.h> 
#include <stdio.h> 
#include <tchar.h> 

//http://stackoverflow.com/questions/1536205/running-another-program-in-windows-bat-file-and-not-create-child-process
//http://svn.haxx.se/users/archive-2008-11/0301.shtml
int _tmain()
{
    //https://msdn.microsoft.com/en-us/library/windows/desktop/ms683156(v=vs.85).aspx
    LPWSTR pCmd = ::GetCommandLine();
    // skip the executable 
    if (*pCmd++ == L'"') 
        while (*pCmd++ != L'"');
    else 
        while (*pCmd != NULL && *pCmd != L' ') ++pCmd;
    while (*pCmd == L' ') pCmd++;
    STARTUPINFO si;
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    PROCESS_INFORMATION pi;
    ZeroMemory(&pi, sizeof(pi));
    // Start the child process. 
    BOOL result = CreateProcess
        (
            NULL, // No module name (use command line) 
            pCmd, // Command line 
            NULL, // Process handle not inheritable 
            NULL, // Thread handle not inheritable 
            FALSE, // Set bInheritHandles to FALSE 
            CREATE_NEW_CONSOLE, // Detach process 
            NULL, // Use parent's environment block 
            NULL, // Use parent's starting directory 
            &si, // Pointer to STARTUPINFO structure 
            &pi // Pointer to PROCESS_INFORMATION structure (returned)
            );
    if (result) return 0;
    wchar_t msg[2048];
    FormatMessage
        (
            FORMAT_MESSAGE_FROM_SYSTEM,
            NULL,
            ::GetLastError(),
            MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT),
            msg, sizeof(msg),
            NULL
            );
    fputws(msg, stderr);
    _flushall();
    return -1;
}

编译后,您可以类似于start命令在DOS提示符下的工作方式使用它。将其放在您附加到preLaunchTasks的脚本中 在Visual Studio Code中。