7-ZipをVisual Studio 2017 Expressでデバッグする

# Visual Studio 2017 Expressのインストール
http://aka.ms/vs/15/release/vs_WDExpress.exe

上記のファイルをダウンロードし、画面の指示に従ってインストールを行います。

# 7-Zipのソースの取得
https://sourceforge.net/projects/sevenzip/files/7-Zip/23.01/

7z2301-src.7zをダウンロード、展開します。

# プロジェクトの変換
今回は7-Zipのファイルマネージャのデバッグを行います。
ファイルマネージャを動作させるには、7z.dllも必要になりますので、
FileManagerと7z.dllを作成するプロジェクトの変換を行います。
7-ZipのソースコードのプロジェクトファイルはVisual Studio 6.0等で使われている、
dsp、dswファイルでしか提供されていません。
最新のVisual Studio 2022 Communityではdswの変換機能が削除されていますので、
今回はVisual Studio 2017 Expressを利用します。(2019で変換可能かどうかは未確認です。)

## 7z.dllのプロジェクトの変換
Format7z.dswをVisual Studio 2017 Expressで開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1783262/08719f37-ee00-d58b-b8ac-2c366aa619dd.png)

ソリューションエクスプローラからasmファイルを削除し、
同名の/7z2301-src/C/*opt.cファイルに置き換えます。
※この手順は以下のサイトで公開されていました。

https://sourceforge.net/p/sevenzip/discussion/45797/thread/3f550826d8/?limit=25&page=2#3294

![asm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1783262/e475b02e-d475-ce2b-c182-16b67e9e47f0.png)

*opt.cファイルのプロパティでプリコンパイル済みヘッダーを使用しないを設定します。

![opt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1783262/e5fb5bfa-441a-008e-42ee-8bd6736c3a22.png)

SDKのバージョンをインストール済みのものに変更し、
関数レベルでリンクする:はい(/Gy)
デバッグできるアセンブリ：はい(/ASSEMBLYDEBUG)
を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1783262/584d9ab8-5d73-6662-55d7-f48c7d689c7f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1783262/7028f0a8-9863-e93a-4fdb-e6ec33754046.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1783262/27224464-30ab-3ce3-fe74-7dfc814cf4dc.png)

以上の設定が終わったら、ソリューションのビルドを実行します。
C:\Util\7z.dllが作成されていれば成功です。

## FileManagerのプロジェクトの変換
FM.dswをVisual Studio 2017 Expressで開きます。

SDKのバージョンをインストール済みのものに変更し、
関数レベルでリンクする:はい(/Gy)
埋め込みマニュフェスト：いいえ
コマンド：C:\Util\7zFM.exe
を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1783262/eb92ed24-f136-7c36-173f-9a5e4fc467ea.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1783262/bea4d418-8b65-bbaa-1b67-9b24d7fddc2c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1783262/df3fdcba-d865-c94b-1cc2-b4afac9dedb8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1783262/92e297a0-8e2f-dec2-1884-b2476ee12636.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1783262/5bcec19a-a833-678c-5fb6-a1aa8fb01352.png)

次に先程作成した7z.dllのプロジェクトを既存のプロジェクトの追加で選択します。

![project.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1783262/7e71653f-42ea-0c11-c806-0cdb0507df73.png)

FMのプロジェクトの依存関係を以下のように設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1783262/855921db-a106-9cf4-6a3d-82844005c1dd.png)

デバッグしたいソースの該当箇所にブレークポイントを設定します。
図の例は
7z > Archive > SquashfsHandler.cpp
のParse4関数にブレークポイントを設定しています。

![project.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1783262/72bda9a6-e632-4993-f9a1-2a4238b34806.png)

デバッグを実行します。
ファイルマネージャで適当な*.opk(SquashFS)ファイルを選択すると、
以下のブレークポイントに到達します。

![project.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1783262/93101c46-9dbe-a92c-e5a1-f6e86ca13087.png)

以上の手順で任意の箇所でブレークできることが確認できました。