Programming, IT, Algorithm, Security
article thumbnail

발단

원래는 CodeRunner로 알고리즘 문제를 풀고 나서 실행했는데 디버깅 기능이 없어서 불편했다

이후 CodeRunner 없이도 Vscode로 설정하면 디버깅과 디버깅 없이 실행이 가능하는 것을 알게되고 나서,

디버깅 설정을 하고 실행하려 했으나 아래와 같은 오류가 발생했다.

 

No such file or directory로 인하여 Unable to start Debugging 오류가 발생했다

원인

VScode에서 launch.json파일을 수정하라고 요구하는 것을 보아, 이는 gcc의 컴파일 빌드 단계가 아니라 gdb 실행 단계에서 발생하는 오류로 추정된다.

 

발생 원인은 VScode 에서 한글 파일명을 인식하는데 문제가 있어 발생하는 오류로 보인다.

 

실제로, test.cpp 코드를 실행할때는 아무 문제 없이 실행되었다.

 

이 문제의 원인을 예로 설명해보겠다. 

소스코드.cpp 파일을 Vscode가 g++를 이용하여 컴파일 하고 그 결과로 소스코드.exe가 만들어진다.

이어서, Vscode는 만들어진 소스코드.exe를 디버거와 함께 실행하게 되는데 이때, 실행파일 명이 한글이라서 오류가 발생하게 되는 것이다.

 

해결

따라서, 이는 VScode에서 소스코드 명이 한글이어도 빌드한 실행파일 명이 영어가 되도록 만드는 것으로 해결이 가능하다.

그 설정은 task.json과 launch.json 파일을 수정하면 가능하다.

 

먼저, task.json 에서 소스코드를 빌드하는 과정에서 만들어지는 실행파일 명이 무조건 temp.exe가 되도록 설정해준다.

커맨드 창

Ctrl + Shift + P로 커맨드 창을 열고 Configure Task를 실행한다. 그리고 다음에 나타나는 거 아무거나 눌러준다.

그럼, 이제 task.json 창이 열렸을 것이다.

 

여기서 우리는 새롭게 코드를 컴파일 하는 task를 만들고, 이를 기본으로 설정해줄것이다.

        {
            "type": "cppbuild",
            "label": "C/C++: g++.exe test build",
            "command": "C:\\Program Files\\mingw64\\bin\\g++.exe",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}\\temp.exe"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "디버거에서 생성된 작업입니다."
        }

위 코드는 tasks 대괄호 안에 넣어준다.

그리고 "command" 뒤에는 자신의 컴파일러 경로를 넣어준다. (경로 구분 \ 가 아니라 \\ 2개로 할것!)

코드를 보면 -o 인자 뒤에 "${fileDirname}\\temp.exe" 가 있는데 이는 출력된 실행파일 이름이 temp.exe로 나온다는 것이다.

따라서 이제 우리는 VScode에서 실행할때 한글로 인한 오류가 발생하지 않을 것이다.

추가로, "group"에 "isDefault"가 true로 설정되어있으니 이제 빌드할때 기본값으로 설정될 것이다.

기본값을 원하지 않는다면 false로 바꾸면 된다.

 

 

다음으로, 이제 만든 temp.exe 파일을 VScode에서 실행해주도록 설정해주어야 한다.

 

launch.json을 열어주자

커맨드창에서 launch.json을 검색해서 열어주자

 

그리고 아래와 같은 코드를 "configurations" 대괄호 안에 붙여넣기 해준다.

        {
            "name": "C/C++: 테스트 파일 빌드 및 디버그",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}\\temp.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "C:\\Program Files\\mingw64\\bin\\gdb.exe",
            "setupCommands": [
                {
                    "description": "gdb에 자동 서식 지정 사용",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "디스어셈블리 버전을 Intel(으)로 설정",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: g++.exe test build"
        },
"program": "${fileDirname}\\temp.exe" 에서 전에 생성한 temp.exe 파일을 실행해주는 것을 알 수 있다.
 
또한, "preLaunchTask": "C/C++: g++.exe test build" 에서 우리가 바로 전에 생성한 task를 먼저 실행하여 빌드한 후에 launch함을 알 수 있다.

참고로, "miDebuggerPath"에는 자신의 디버거 경로를 입력해주어야한다.

 

이제 모든 설정이 완료 되었다.

 

이제는 빌드하고 실행하면 임시로 temp.exe라는 실행파일이 빌드되고 오류 없이 정상적으로 이 파일이 실행될 것이다.

 

당연하지만, 원리 상 동시에 여러 실행파일이 필요한 경우에는 이 방법을 사용하면 안된다.

단일 소스 코드를 테스트 해볼때 적합하다. 

profile

Programming, IT, Algorithm, Security

@PITAS

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!