RealPath:
WebPath:
2017/02/12 02:24 (JST) 更新
MinGW on MSYS >>

VisualStudioでデバッグ(cmake,mingw)

Contents

概要

cmake により MinGW gcc でビルドしたプログラムを Visual Studio でデバッグする。
今回は Boost に依存するプログラムを対象としてみる。

前提

CMakeLists.txt 作成済みのプロジェクトがあること。

以下のようなファイル構成を想定。

  • C:/Projects/ThreadSample/
    • .gitignore
    • main.cpp
    • CMakeLists.txt
    • ThreadSample.exe

.gitignore

.gitignore
CMakeCache.txt
CMakeFiles
Makefile
ThreadSample.exe
cmake_install.cmake

C++ソースコード (main.cpp)

boost::thread に依存する実装例。

main.cpp
#include <stdio.h>
#include <unistd.h>
#include <boost/thread.hpp>

void ThreadFunc(const char *str)
{
    for(int i = 0; i < 5; i++){
        printf("%s %d, ", str, i);
        sleep(0.3);
    }
}

int main() {
    boost::thread threadA(boost::bind(&ThreadFunc, "A"));
    boost::thread threadZ(boost::bind(&ThreadFunc, "Z"));
    threadA.join();
    threadZ.join();
    std::cin.get();
    return 0;
}

CMakeLists.txt

cmake により Boost ライブラリへのリンクを自動化する。(これを生の Makefile で実現しようとするとなかなか骨が折れるので cmake を用いるのが好ましい)

CMakeLists.txt
cmake_minimum_required(VERSION 3.7)

set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
find_package(Boost REQUIRED thread)
if(Boost_FOUND)
    message(STATUS "!!! BOOST FOUND !!!")
else()
    message(STATUS "!!! BOOST NOT FOUND !!!")
endif()

ADD_EXECUTABLE(ThreadSample main.cpp)
TARGET_LINK_LIBRARIES(ThreadSample ${Boost_LIBRARIES})
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR})

ビルド&実行確認

※今回はデバッグ実行を行うことが目的であるため cmake 引数に -DCMAKE_BUILD_TYPE=Debug を指定する。

dos
> cmake -G "MSYS Makefiles" -DCMAKE_BUILD_TYPE=Debug
> make
> ThreadSample.exe
A 0, Z 0, A 1, Z 1, A 2, Z 2, A 3, Z 3, A 4, Z 4,

この時点で Makefile が生成されるので、これ以降でプロジェクト構成(ファイル構成等)が変わらない限りは cmake を実行し直す必要は無い。

Visual Studio Makefile プロジェクトの作成

Visual Studio 2015 にて。

  • メニュー - [File] - [New] - [Project From Existing Code...]
    • Selcomt to the Create Project from Existing Code Files Wizard
      • What type of project would you like to create? = Visual C++
    • Specify Project Location and Source Files
      • Project file location = C:\Projects\ThreadSample
      • Project name = ThreadSample
    • Specify Project Settings
      • Use external build system = ON
    • Specify Debug Configuration Settings
      • Build command line = make
      • Rebuild command line = make clean && make
      • Clean command line = make clean
      • Output (for debugging) = ThreadSample.exe

Visual Studio プロジェクト設定

  • Project Property Pages - General - VC++ Directories
    • Include Directories = ....;$(BOOST_ROOT);$(CPLUS_INCLUDE_PATH)

Visual Studio からのビルド

メニュー - [Build] - [Build Solution]
または
メニュー - [Build] - [Rebuild Solution]

Output
1>------ Rebuild All started: Project: ThreadSample, Configuration: Debug Win32 ------
1>  [ 50%] Building CXX object CMakeFiles/ThreadSample.dir/main.cpp.obj
1>  [100%] Linking CXX executable ThreadSample.exe
1>  [100%] Built target ThreadSample
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========

Viaual Studio からの実行(非デバッグ)

メニュー - [Debug] - [Start Without Debugging]

実行結果
Z 0, A 0, Z 1, Z 2, Z 3, Z 4, A 1, A 2, A 3, A 4,

Visual Studio からのデバッグ実行

WinGDB の導入

http://www.wingdb.com/ より WinGDB をインストールしておく。
※有料。30日トライアルあり。正式価格は1万円程度。現時点(2017年2月)ではVisual Studio 2013, 2015等に対応。2017にはまだ対応されてない。

WinGDB の設定

  • プロジェクト右クリックメニュー - [WinGDB] - [Properties]
    • General - Target type = Windows native application (MinGW/Cygwin)
    • Environment - Debugger path = gdb
    • Debug - Excutable path = $(TargetPath)

ブレークポイント設定

ソースコード内の適当な位置にブレークポイント設定

WinGDB によるデバッグ実行

メニュー - [WinGDB] - [Start Debugging]

これで起動すると設定したブレークポイントで処理が止まり、ウォッチウィンドウ等で状態を確認することができる。