# Custom Vscode Extension Analyzer Debug
最近都告一段落了,晚上臨時起意寫了個plugin 結合我的靜態分析器
> apt-get install npm
> apt-get install npde.js
>https://code.visualstudio.com/api/get-started/your-first-extension
![](https://i.imgur.com/uNkmq39.png)
> 選取 vscode extension development
![](https://i.imgur.com/5eaRw2Q.png)
extension 使用的是 typescript 從vue.js 3改版後就很久沒寫 javascript 來寫一下
> ctrl + shift + p 輸入 hello word 即可在右下角看到剛才註冊的 extension
![](https://i.imgur.com/j4V7QTg.png)
> 論文到尾聲,或許需要部屬到 docker ,這邊只是實驗性質的去寫一個vscode 實現我 static analyzer breakpoints extension
參考了這兩個 網站,一個是真正 debuger run 起來的
https://stackoverflow.com/questions/56012353/how-to-get-vs-code-debug-data-like-breakpoints-steps-line-code
第二個網址才是可以攔截breakpoint增加或刪除
https://stackoverflow.com/questions/57250136/can-i-capture-breakpoint-event-on-vscode
看一下返回的資料結構是個array 我們直接把他 console.log 出來
![](https://i.imgur.com/dvBl1WV.png)
![](https://i.imgur.com/LWiFJfs.png)
到著邊幾乎我們就已經把我們的前置作業做完了
![](https://i.imgur.com/tWjmLSG.png)
嘗試找到一個可以寫入檔案的位置
```bash=
const storagePath = context.storagePath;
const globalStoragePath = context.globalStoragePath;
```
嘗試寫檔案
```javascript=
fs.writeFile(globalStoragePath+'/test.txt', '您好嗎?', function (err: any) {
if (err)
console.log(err);
else
console.log('Write operation complete.');
});
```
撈取斷點infomation
![](https://i.imgur.com/So95tq3.png)
可以看到已經可以得到debug 斷點的位置
```
/root/test/test.cpp
/root/.vscode-server/bin/c13f1abb110fc756f9b3a6f16670df9cd9d4cf63/out/bootstrap-fork.js:5
28
/root/.vscode-server/bin/c13f1abb110fc756f9b3a6f16670df9cd9d4cf63/out/bootstrap-fork.js:5
```
這邊 斷點的行數跟我的plugin 實際斷點的位置有點不太一樣
![](https://i.imgur.com/hJFdqyX.png)
```javascript=
var fs = require('fs');
for (let sess of session.added) {
const obj =Object.values(sess);
const path =Object.values(obj[1]);
const line =Object.values(obj[1]);
let getpath = path[0];
let getline = path[1];
// var property = 'path';
// console.log(line);
console.log(getpath['path']);
console.log(getline['_start']['_line']);
// console.log(obj);
// Object.keys(test).forEach(key => {
// console.log(key);
// });
// console.log(sess.location.url);
fs.appendFile(globalStoragePath+'/breakpoint',getpath['path']+" "+ (Number(getline['_start']['_line'])+1) +"\n" , function (err: any) {
if (err)
console.log(err);
else
console.log('Write operation complete.');
});
}
```
extension 開始前初始化
```javascript=
var fs = require('fs');
fs.unlink(globalStoragePath+'/breakpoint', err => {
if(err) console.log('init error');
})
```
來開始處理gcc plugin 這部分
```cpp=
breakpoint getbp;
std::ifstream ifs("input.txt", std::ios::in);
if (!ifs.is_open())
{
cout << "Failed to open file.\n";
}
else
{
std::string name;
int score;
while (ifs >> name >> score)
{
getbp.name = name.c_str();
getbp.line = score + 1;
fprintf(stderr, "%s %d\n", getbp.name, getbp.line);
// cout << name << " " << score << "\n";
vbreakpoint.push_back(getbp);
// scores.push_back(score);
}
ifs.close();
}
ifs.close();
```
嘗試讓extension 可以顯示可以複製訊息
>vscode.window.showInformationMessage("you setting in globalStoragePath:"+globalStoragePath)
![](https://i.imgur.com/tuYI2rt.png)
斷點初始化
```javascript=
var fs = require('fs');
const globalStoragePath = context.globalStoragePath;
fs.unlink(globalStoragePath+'/breakpoint.txt', (err: any) => {
if(err) console.log('init error');
})
for (let sess of session.added) {
const obj =Object.values(sess);
const path =Object.values(obj[1]);
const line =Object.values(obj[1]);
let getpath = path[0];
let getline = path[1];
// var property = 'path';
// console.log(line);
console.log(getpath['path']);
console.log(getline['_start']['_line']);
// console.log(obj);
// Object.keys(test).forEach(key => {
// console.log(key);
// });
// console.log(sess.location.url);
fs.appendFile(globalStoragePath+'/breakpoint.txt',getpath['path']+" "+ (Number(getline['_start']['_line'])+1) +"\n" , function (err: any) {
if (err)
console.log(err);
else
console.log('Write operation complete.');
});
}
console.log("globalStoragePath" + globalStoragePath);
console.log("Breakpoint changed" + session.added);
```
![](https://i.imgur.com/rvesGtv.png)
組合一下
![](https://i.imgur.com/4WOu42j.png)
![](https://i.imgur.com/UmtJaK8.png)
參考 gimple
https://code.woboq.org/gcc/gcc/input.h.html
![](https://i.imgur.com/6R5Zb1w.png)
到這邊我的靜態分析器就支援 vscode extension
![](https://i.imgur.com/Dqnu7rG.png)
```c=
int find = 0;
for (int i = 0; i < vbreakpoint.size(); i++)
{
size_t found = vbreakpoint[i].name.find(LOCATION_FILE(loc));
if (found)
if (vbreakpoint[i].line == LOCATION_LINE(loc))
{
fprintf(stderr, "set breakpoint %s %d\n", vbreakpoint[i].name.c_str(), vbreakpoint[i].line);
find = 1;
}
}
if (find == 0)
return;
```
# 流程
ctrl + shift + p 輸入 helloword 打開我的插件
![](https://i.imgur.com/GqVvqqR.png)
修改讀取 breakpoint 路徑
![](https://i.imgur.com/YyOi60C.png)
到這裡我們就可以自由的使用vscode ide 配合gcc plugin 去debug
![](https://i.imgur.com/fYFoZrv.png)
plugin 可能要等真正寫完論文才能公布了
![](https://i.imgur.com/FfiCHyB.png)