External Memory

プログラミング周辺知識の備忘録メイン

開発環境の構築(2) C++

C++の勉強用環境構築。
息抜きのオンラインジャッジ用途としても使いたいので、
windowsgccが使えるようにする。
editorとしてVisual Studio Codeを使い、
コンパイル用途以外でも使えそうなbash on Ubuntu on windowsを組み合わせた。

bash on Ubuntu on windowsインストー

・スタートボタン右クリック
・「アプリと機能」をクリック
・右上の「プログラムと機能」をクリック
・「Windowsの機能の有効化または無効化」をクリック
・「Windows Subsystem for Linux (Beta)」にチェック→インストー

bash.exeを起動させる。

-- ベータ機能 --
これにより Windows に Ubuntu がインストールされます。Ubuntu は Canonical によって配布される製品であり、
次のサイトに示される条件に基づいてライセンスされています。
https://aka.ms/uowterms

続行するには、"y" を入力してください: y
Windows ストアからダウンロードしています... 100%
ファイル システムを展開しています。この処理には数分かかります...
Ubuntu のロケールを Windows のロケール (ja-JP) と一致するように設定しますか?
既定のロケールは en_US です。
続行するには、"y" を入力してください: y
既定の UNIX ユーザー アカウントを作成してください。ユーザー名は、Windows のユーザー名と一致する必要はありません。
詳細: https://aka.ms/wslusers を参照してください
新しい UNIX ユーザー名を入力してください: [username]を入力
新しい UNIX パスワードを入力してください:
新しい UNIX パスワードを再入力してください:
passwd: password updated successfully
インストールが正常に終了しました
環境が間もなく開始されます...
ドキュメントを参照できる場所: https://aka.ms/wsldocs
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

$ ls -al
合計 8
drwxr-xr-x 0 user user  512  7月 23 09:24 .
drwxr-xr-x 0 root root  512  7月 23 09:24 ..
-rw-r--r-- 1 user user  220  7月 23 09:24 .bash_logout
-rw-r--r-- 1 user user 3771  7月 23 09:24 .bashrc
-rw-r--r-- 1 user user  655  7月 23 09:24 .profile

$ sudo apt update
$ sudo apt upgrade

$ g++ --version
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

VScodeをインストー

Visual Studio Code - Code Editing. Redefined

からダウンロード後、指示に従ってインストール。

統合ターミナルをbash on Ubuntu on Windowsとするため、
VScode 基本設定→設定から
右パレット(ユーザー設定)に下記を書きこむ。

{
  "terminal.integrated.shell.windows": "C:\\WINDOWS\\sysnative\\bash.exe"
}

ctrl+@ で統合ターミナルとしてbashが開く。

#include <iostream>
using namespace std;

int main(){
    cout<<"test"<< endl;
    return 0;
}
$ g++ -Wall -O2 test.cpp
$ ./a.out
test


C/C++拡張機能をインストールしたが
VScodeからはコンパイルデバッグができなかった。
c_cpp_properties.jsonにincludeパスを追加しても通らない。

とりあえずデバッグgdbありゃいいかな。

$sudo apt install gdb 

$ gdb ./a.out
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.04) 7.11.1
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
---Type <return> to continue, or q <return> to quit---
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./a.out...(no debugging symbols found)...done.
(gdb) b main
Breakpoint 1 at 0x40084a
(gdb) run
Starting program: /mnt/c/Users/[username]/vsbin/a.out

Breakpoint 1, 0x000000000040084a in main ()
(gdb) i r
rax            0x400846 4196422
rbx            0x0      0
rcx            0xc0     192
rdx            0x7ffffffde4b8   140737488217272
rsi            0x7ffffffde4a8   140737488217256
rdi            0x1      1
rbp            0x7ffffffde3c0   0x7ffffffde3c0
rsp            0x7ffffffde3c0   0x7ffffffde3c0
r8             0x7fffff3efac0   140737475705536
r9             0x7fffff3e4780   140737475659648
r10            0x32f    815
r11            0x7ffffecda280   140737468277376
r12            0x400750 4196176
---Type <return> to continue, or q <return> to quit---
r13            0x7ffffffde4a0   140737488217248
r14            0x0      0
r15            0x0      0
rip            0x40084a 0x40084a <main+4>
eflags         0x246    [ PF ZF IF ]
cs             0x33     51
ss             0x2b     43
ds             0x0      0
es             0x0      0
fs             0x0      0
gs             0x0      0
(gdb) x/16 $rsp
0x7ffffffde3c0: 4196544 0       -20182992       32767
0x7ffffffde3d0: 0       0       -138072 32767
0x7ffffffde3e0: -138056 1       4196422 0
0x7ffffffde3f0: 0       0       -1844874634     1522134322
(gdb) x/16x $rsp
0x7ffffffde3c0: 0x004008c0      0x00000000      0xfecc0830      0x00007fff
0x7ffffffde3d0: 0x00000000      0x00000000      0xfffde4a8      0x00007fff
0x7ffffffde3e0: 0xfffde4b8      0x00000001      0x00400846      0x00000000
0x7ffffffde3f0: 0x00000000      0x00000000      0x92097276      0x5ab9ed32
(gdb) disas main
Dump of assembler code for function main:
   0x0000000000400846 <+0>:     push   %rbp
   0x0000000000400847 <+1>:     mov    %rsp,%rbp
=> 0x000000000040084a <+4>:     mov    $0x400944,%esi
   0x000000000040084f <+9>:     mov    $0x601060,%edi
   0x0000000000400854 <+14>:    callq  0x400710 <_ZStlsISt11char_traitsIcEERSt13basic_ostream
IcT_ES5_PKc@plt>
   0x0000000000400859 <+19>:    mov    $0x400730,%esi
   0x000000000040085e <+24>:    mov    %rax,%rdi
   0x0000000000400861 <+27>:    callq  0x400720 <_ZNSolsEPFRSoS_E@plt>
   0x0000000000400866 <+32>:    mov    $0x0,%eax
   0x000000000040086b <+37>:    pop    %rbp
   0x000000000040086c <+38>:    retq
---Type <return> to continue, or q <return> to quit---q
Quit
(gdb) c
Continuing.
test
[Inferior 1 (process 14) exited normally]
(gdb) exit
Undefined command: "exit".  Try "help".
(gdb) q