Eclipse CDT での Debugger [忘備録]

Eclipse CDT での Debugger の使い方についてです。
他の環境で他のツールを使用してしばらく経つと、以前使用してたツールの使い方が曖昧になり使い方を調べることありませんか？
（私はあります。最近は特に...）
なので、別の環境や別のツールを使い始める前に、使い慣れているデバッグ環境の Eclipse CDT Debugger の 使い方をまとめました。

参考になれば幸いです。

# 準備
## C++ プロジェクト 設定
### 最適化 オプション
![22.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/8eb1b089-3c23-641c-de0a-c0a63a3fecb7.png)

* デバッグに影響ない範囲での最適化 のオプションの -Og がお勧め。 

### Debugging オプション 
![23.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/38c029f7-fa0a-b866-2519-894ae4cfff1a.png)

* ①はNone でなければどれでも...　とりあえず -g3

## Core 出力有効化
* Core file を 共有メモリに出力するように設定する。

### ubuntu 16.04 での例

```
~/.bashrc の最下行に 下記行を追加
	ulimit -c unlimited		

/etc/sysctl.conf に 下記行を追加
	kernel.core_pattern = /dev/shm/core.%p
	
/etc/default/apport の enabled=1 を enabled=0　に変更
```

### CentOS 7 での例
```
/etc/systemd/system.conf の ↓項目を編集。
    DefaultLimitCORE=infinity 

/etc/sysctl.conf の 下記行を追加
    kernel.core_pattern = /dev/shm/core.%p
```
 

# Eclipse CDT Debugger 
## Project 毎設定
### プロジェクト選択 
![01.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/d85a5a52-1fa7-62c7-4072-0b8a1ddd40d5.png)

    [対象プロジェクト](右クリック) → [Debug As] → [Debug Configuration]

### 対象バイナリ確認
![02.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/c606b9e5-8937-eee8-427d-5b058b18e0d8.png)

* [Main]タブ を選択。
* ①が 対象プロジェクト名か確認。
* ②が 対象バイナリのPath File名か確認。

### デバッグ対象への起動引数

![03.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/298471eb-a793-e5f2-f551-1bdc69100b78.png)

####　起動時引数を与える場合
* [Arguments]タブ を選択。 
* ① に 起動引数を記述する。
* ② [Apply] ボタン押下で適用。

### デバッグ画面への移行
* 上図の ③ [Debug] ボタン押下でデバッグ画面に移行する。
* 下図の Debug用のビュー配置に変更するかの問い画面がでる場合には ①[yes]を押下。

![04.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/305a94af-ceb3-ffb1-9cc3-c55645eca8d5.png)

* ②にチェックを入れると、次回以降は
上図の画面は出現しなくなる。

## デバッグ画面
* デバッグ向けのView 配置に切り替わる。

![05.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/96350e1d-cc01-88db-916d-4abd8891e1d7.png)

### お勧め View 
#### Disassembly
* 追加方法

```
[Window] → [Show View] → [Disassembly]
```
![08.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/d273d0bf-1135-cad1-b657-065011f88542.png)

* アッセンブラを確認できます。

#### Expriession
* 追加方法

```
[Window] → [Show View] → [Expriession]
```

![09.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/3055999f-3223-c0fe-3ea0-6ebfa4d09fa5.png)

* Expression項に 注目する変数／配列／クラスインスタンス名 を入力し、値の確認が可能。
* [Visiable]タブでは スコープ内の全てを対象とするため、項目数の増減で表示位置がズレて目で追いにくい場合もありますが、[Expression]タブ では自前で登録するため、注目するものが絞れてる場合に便利です。
* Value項の値は手入力で変更が可能。　条件式が意図した通りに動くか確認する時などに便利です。

## デバッグ操作
![06.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/e3f35f16-4813-3aa3-e9c5-d45d8859a17e.png)


| 番号 | 機能名 | 内容 |
|:-:|:-:|:--|
| ![06_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/966a490b-b48c-b4d8-9569-69cc0fde8aab.png) | Resume(F8)  | 実行再開。 |
| ![06_2.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/37287815-d1f8-bf54-bc0b-8aafb828b9e0.png) | Suspend  | 一時停止。  |
| ![06_3.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/62091097-a0e9-fd7f-03bb-faee70ed6d51.png) | Terminate(Ctrl+F2)  | 強制終了。 |
| ![06_4.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/a2e22522-c691-d1d6-b258-e65948ac79ff.png) | Disconnect  | 強制終了。  |
| ![06_5.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/733fd337-b55f-eaa1-7f82-f5bf8329a7e0.png) | Step Into (F5) | 1ステップ進める。呼び出し先には入る。  |
| ![06_6.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/c42ea9fa-9fff-765b-86ac-196f98b98361.png) | Step Over (F6) | 1ステップ進める。呼び出し先には入らない。  |
| ![06_7.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/115da228-dc7d-2a88-f4a4-dc8ff7043698.png) | Step Return (F7) | 呼び出し元に戻るまで処理を進める。  |

### カーソル行まで実行
    [ctrl] + [R]

## デバッグ再実行
対象が一旦終了した後、先頭から実行を行う時の手順です。　２通り記載します。
### デバッグターゲットの再利用
![10.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/57b0232b-1fc0-6946-c1d3-205057a9f0df.png)

```
 [デバッグターゲット](右クリック) → [Relaunch]

 ショートカットキー:  [F11]
```


### デバッグ開始ボタン

![11.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/3fdf7743-f507-0fee-928b-46e2304cd61c.png)

##### 注意
* 前回のデバッグターゲットが終了してない状態で、デバッグ開始を行うと、デバッグターゲットが追加されていきます。（下図）

![12.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/326e93a2-697c-bb8c-2e03-d04df99fdc86.png)

* デバッグターゲット数が多いと、Debug操作が反応しなくなったり、Eclipse の挙動がおかしくなる事を体験してます。
* デバッグターゲット数は必要最小を保つのが良さそうです。



## Breakpoint
### 登録／解除
![13.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/63a9b99b-7515-3c3a-333f-96dd8ecc12e4.png)

* Breakpoint を登録したい行の　行番号の左を　ダブルクリック。 上図のマークがBreakpoint を示します。
* マークを ダブルクリックすることで Breakpoint解除。マークが消えます。

### Breakpoints View 
![14_0.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/c0855e21-cb92-b446-2592-afbedb4a8c55.png)

#### 有効化／無効化
* ①のチェックを入りで Breakpoint 有効。　チェックなしで Breakpoint 無効。

#### 全無視
* ②のボタンはドグル式です。 
* ボタンＯＮ時には Breakpointを 全て無視 します。（無視するだけで、Breakpointは解除されません）
* ボタンＯＦＦ時には ①のチェックに従います。

#### 全解除
* ③のボタン押下で、全てのBreakpoint を解除。

#### Breakpoint 位置のソースへ飛ぶ 
* 対象行をダブルクリック。　
* または、対象行をクリックした後に④ボタン。

## Breakpoint Properties
Breakpoint に 条件設定 や 動作指定(音や外部コマンド連携）を 行う。
### ダイアログの開き方
* Source View 上で 対象のBreakpoint マークで 右クリックし、[Breakpoint Properties] をクリックする。 

![15.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/be09fcfe-7bad-33bf-7b37-5efb19c33e17.png)



### Common
![16.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/067dd1f7-675e-edc1-c21a-45b4694a30a9.png)

#### ① Line number
* Breakpoint の 位置(行番号)を 変更可能。

#### ② Condition
* 停止する **条件式** を記載可能。　(便利！！）

#### ③ Ignore count
* この値の回数ぶん、このBreakpointへの到達を無視する。
* 指定回数無視を行うと、この値は0に戻る。

### Action

![17.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/252e4679-adbf-6c92-e41a-97b2fbe68ac2.png)

* Actions for this Breakpoint は、この Breakpoint に 登録された動作を示す。登録は複数可能。
* Available actions には、予め設定した動作の一覧が表示される。Breakpointに付与する動作は、この中から選択する。
* Available action の動作は [New] ボタンで追加可能。

#### New Breakpoint Action
![18_2.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/98ac652b-a86e-78b3-f046-76f0459100bb.png)

* ① Action name: 識別名。
* ② Attion type: タイプ一覧の中から選択する。
* ③ Sound Action: Breakpoint での停止時にwebファイルを再生させる。（Webファイルは予め用意しておく必要あり＝好みのものを使用可能）
* 他のアクションタイプは...　よく分かってません...。　便利な使い方を教えて頂けると幸いです...。

## Dynamic Printf
* Breakpoint の一種。
* 登録した出力文をコンソールに表示するが、停止はしない。
* 出力文は printf 形式で ローカル変数の表示可。
* ソースコードを変更することなく、printf 出力が行る。　（便利！！）

### 登録方法
* Source View 上で [Dynamic Printf] を 登録したい行の行番号の左で、右クリックし、[Breakpoint Types] → [C/C++ Dynamic Printf] を選択。

![19.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/4ab92dcc-15e3-fd72-363f-0b1e22e93723.png)

* 以降、行番号左をダブルクリックすると、Dynamic Printf が登録される。

![20_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/7cd19252-571c-586b-ed2f-ba0157471c2d.png) ←このマークが Dynamic Printf　

### 無効化／有効化／全無視／全解除
* Breakpoint と同じ。　
* Breakpoint view から操作可能。

## Dynamic Printf Propaty
### ダイアログの開き方 
Source View 上で 対象の Dynamic Printf マークを 右クリックし、[Breakpoint Properties] をクリックする。

### Common
![21.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/4329e98d-c757-cc78-d7ea-b478f480ed19.png)

#### ① Line number
* Dynamic Printf の 位置(行番号)を 変更可能。

#### ② Condition
* 表示条件の 条件式 を記載可能。　

#### ③ Ignore count
* この値の回数ぶん、この Dynamic Printf への到達を無視する。

#### ④ 出力文 
* printf 形式。ローカル変数 使用可。```__LINE__``` 等も使用可 (すごい!!)


#Core File からのデバッグ
* coreファイルから Eclipse CDT Debugger で調査する事も可能です。

```[Run] → [Debug Configuration]```
![24.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/b1209278-b8f3-3a7b-9ff0-81017eefbb4b.png)

* [C/C++ Postmortem Debugger]　下位の　対象プロジェクトを選択 

![25.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/3843f2a3-b2dc-3964-5698-10b6d4fa8c96.png)

* 対象プロジェクトが登録されてなければ [New] ボタン

![26.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/8cf622fb-f43a-d1c9-38da-f3bc422edc7a.png)

* ①② が 対象プロジェクトのものか確認する。
* ③に Core ファイル名を入力。
* [Debug]ボタン 押下。

![27.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/1a00c764-e848-a33d-c789-7b786f6e1411.png)

* Breakpoint で停止させた時と同様に、調査が可能です。

# 参考文献
* [Eclipse Help] (https://help.eclipse.org/neon/index.jsp?topic=%2Forg.eclipse.cdt.doc.user%2Ftasks%2Fcdt_o_run.htm&cp=8_3_5)
* [Eclipse CDT / GDB - open core dump? (stack overflow)](https://stackoverflow.com/questions/16413123/eclipse-cdt-gdb-open-core-dump)
* [Rational Developer for System z 9.0 プロジェクトの実行およびデバッグ (IBM Knowledge Center) ] (https://www.ibm.com/support/knowledgecenter/ja/SSQ2R2_9.0.0/org.eclipse.cdt.doc.user/tasks/cdt_o_debug.htm)

* [Debugging with GDB](https://sourceware.org/gdb/current/onlinedocs/gdb/)
* [Eclipseデバッガを活用するための31のtips (SlideShare)](https://www.slideshare.net/kompiro/eclipse30tips)

---
ここまで読んで頂きありがとうございました。