The Way

windows gdb c++ stl이 예쁘게 안 나올 때 본문

공부/C++ 메모사항

windows gdb c++ stl이 예쁘게 안 나올 때

Jeonggyun 2018. 10. 13. 22:16

windows로 c++ 코딩을 할 때, 디버깅을 할 때 vector, string, map 등의 stl이 예쁘게 출력되지 않는 경우가 있다.


Visual Studio로 할 경우에는 대체로 문제가 없는 편인데, Dev c++이나 Visual Studio Code, Code::Blocks 등을 사용할때는 (적어도 나는) 항상 이런 문제가 발생했다.


arr는 vector<int>인데, 안의 원소가 안보이고 메모리 주소만 잔뜩 보인다.


PS를 하면서 STL은 필수적인데, 디버깅 할때 안의 원소를 보지 못한다는 것은 가히 치명적이라고 할 수 있다.

그냥 Visual Studio를 쓰면 안되냐고 물을 수 있는데,

Visual Studio은 너무 무겁기도 하고, 오픈 소스도 아니고,

g++이 아니라 #include <bits/stdc++.h>을 못 쓴다거나, min, max를 쓰려면 #include <algorithm>을 해야한다거나 하는 사소한 불편함이 있었다.


리눅스에서는 한방에 잘 나오는데 윈도우에서만 안되가지고 몇 시간의 시행착오를 겪은 뒤에 드디어 성공했다(...)

따라서 Visual Studio Code 기준으로 오늘 헤맨 과정을 간단히 적어보려 한다...



1. MinGW

시작하기 전에 MinGW에 대한 이해가 먼저 필요할 것이다.

리눅스에서는 초기 설정(build-essential이라거나)만 잘 해주면 gcc, g++, gdb가 바로 되지만 윈도우는 그렇지 아니하다.

때문에 MinGW라는 것을 설치해주어야 한다.


설치 과정은 http://webnautes.tistory.com/1196에 잘 설명되어 있다.

설치를 마치고 시스템 변수 path에 경로(C:/MinGW/bin)까지 추가를 마치면, 윈도우에서도 다음과 같은 사용이 가능해진다.


이유는 간단한데, 저 경로에 exe파일들이 생겼기 때문이다. 저 exe파일을 사용해도 무방하다.


그런데 아마도 이 상황에서 gdb를 이용해 cpp stl을 디버깅하면 그림 1처럼 메모리 주소만 뜰 것이다.



2. gdb와 gdb-python27

대충 찾아보니, stl이 예쁘게 출력되는 과정에는 python2.7로 처리하는 과정이 필요하다고 한다.

MinGW installer로 gdb-python을 추가로 설치해주고,


python2.7도 마찬가지로 설치해주자.

(https://www.python.org/downloads/release/python-2715/ 에서 msi 파일을 다운받고 설치하면 된다)


설치가 끝났으면 처리하는 데 필요한 정보가 든 파일을 만들어줘야 한다.



/* (수정)

하기 전에 다운로드가 필요하다. MinGW폴더에 있는 python파일로 하면 map과 set이 잘 안나오더라...

C:/MinGW/share/gcc-6.3.0 경로에 있는 python 폴더를 과감히 지워버리고,

다음 압축 파일로 대체하자.

python.zip

*/



.gdbinit이름으로 파일을 하나 만들고, 안에 다음과 같이 적는다.


python

import sys

sys.path.insert(0, 'C:/MinGW/share/gcc-6.3.0/python')

from libstdcxx.v6.printers import register_libstdcxx_printers

register_libstdcxx_printers (None)

end

참고로 3번째 줄의 gcc-6.3.0은 저 경로의 폴더에 가서 버전 이름이 맞는지 확인을 해줘야 한다.


파일을 저장할 때, 윈도우 관점에서는 확장자가 gdbinit이고 이름이 없는 파일로 읽히기 때문에 f2를 이용해 이름을 바꾸면 거부당할 여지가 있다.

sublime text나 메모장등을 이용해 저장하자.


저장 경로는 C:에 저장하는 것이 무난할 듯 하다.


이제 거의 다 됐다.

똑같이 gdb를 실행하되,

gdb 대신 gdb-python27을 입력하고 킨 다음,

켜지자마자 source C:/.gdbinit을 입력해보자.


아래 3줄을 보면, source C:/.gdbinit을 입력한 전후에 vector<int>가 표시되는 형태가 달라진 것을 확인할 수 있을 것이다.



3. 조금 더 편하게

그런데 매번 source를 쳐주면 굉장히 번거로울 것이다. 이를 환경변수에 등록해보자.

제어판-시스템-시스템 환경 변수 설정에 들어가서

환경 변수에 HOME을 C:로 추가하자.


이제 따로 source를 입력하지 않아도 바로 될 것이다.


Visual Studio Code를 이용해서 할 때는 약간의 처리를 더 해주어야 한다.

launch.json 파일을 만들어서, configuration을 추가해주어야 한다.


launch.json 파일에는 다음과 같은 정보를 입력한다.

{

    "version": "0.2.0",

    "configurations": [

        

        {

            "name": "(gdb) Launch",

            "type": "cppdbg",

            "request": "launch",

            "program": "${workspaceFolder}/a.exe",

            "args": [],

            "stopAtEntry": false,

            "cwd": "${workspaceFolder}",

            "environment": [],

            "externalConsole": true,

            "MIMode": "gdb",

            "miDebuggerPath": "C:/MinGW/bin/gdb-python27.exe",

            "setupCommands": [

                {

                    "description": "Enable pretty-printing for gdb",

                    "text": "-enable-pretty-printing",

                    "ignoreFailures": true

                }

            ]

        }

    ]


빨간색 표시된 부분을 유의하자. program에는 자신이 디버깅할 프로그램 이름이 들어가야 하며, miDebuggerPath에는 gdb.exe대신 gdb-python27.exe를 넣어주어야 한다.


여기까지 설정을 마치고 나면 다음과 같이 stl 변수들도 잘 나오는 것을 확인할 수 있다.

Comments