-
Notifications
You must be signed in to change notification settings - Fork 0
/
search.xml
50 lines (50 loc) · 12.7 KB
/
search.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title><![CDATA[vscode 远程开发]]></title>
<url>%2F2019%2F07%2F14%2Fvscode%E8%BF%9C%E7%A8%8B%E5%BC%80%E5%8F%91%2F</url>
<content type="text"><![CDATA[场景描述 解决方案 REMOTE-SSH REMOTE VSCODE SFTP ⭐ 场景描述 Windows 下用 vscode 进行开发 Linux 服务器的内核被精简过,而且无法直接连接外网下载安装其他软件,只能从虚拟桌面下载后拷贝到服务器上进行离线安装 项目在远程服务器上,源代码的目录结构与安装部署之后的目录结构差异很大,比如 B 目录在源码中是 A 的子目录,但是安装之后 B 目录的文件将被移动到其他地方,库代码会安装到第三方库路径/usr/lib/python2.7/site-packages/xx下,有的代码会放到 www/xxx cgi 对应的路径下。因此在本地开发后拷贝到服务器上还要找对路径 如果是在本地编辑,编辑之后拷贝到服务器上运行,有时候需要修改的代码只有一点点,又迫切想看到效果,就会直接在服务器上进行修改,很容易出现单边问题 解决方案REMOTE-SSH 下载安装好 remote-ssh 微软发布的远程开发工具套件中的一个,不幸的是这个插件连接服务器后会自动在服务器上下载安装 .vscode-server,但是我们的服务器是无法连接外网的,所以下载失败。 把 vscode 的输出打开,可以看到执行哪个脚本失败,找到这个安装脚本 vscode-remote-install.xxxxx.sh,手动执行里面的代码,在下载 .vscode-server的时候出错,手动通过虚拟桌面把这个文件下载下来,链接如下: 12# 自行将 $COMMIT_ID 替换成 上面得到的数值https://update.code.visualstudio.com/commit:$COMMIT_ID/server-linux-x64/insider 下载完放到服务器 $HOME 目录下后,接着执行脚本中剩下的步骤,最终目录如下 12345678910.vscode-server/├── bin│ └── xxxxx├── data│ ├── logs│ ├── Machine│ ├── machineid│ └── User└── extensions └── ms-python.python-2019.5.18875 好了,离线安装上了,应该可以正常链接了吧,通过 vscode 去链接远程服务器,发现报错 g++ 版本不对,因为这台服务器的内核被精简过,很多软件包都缺失,离线安装新版本太痛苦;而且新的 g++ 又可能因为版本不对导致项目运行不起来 因此,该方案不可行如果能装上还是很不错的,装上之后在 vscode 可以直接检索打开远程机器上的文件夹,就像在本地开发一样。 REMOTE VSCODE 安装使用过程 缺点 每次使用都需要先在本地执行一下 ssh -R 52698:127.0.0.1:52698 [email protected] 远程机器上打开文件时需要指定端口 rmate -p 52698 linux中的文件名称,可以通过 alias 解决 只能编辑单个文件 优点编辑单个文件很方便,在当前路径下的文件可以直接在 vscode 上打开该文件,而不像 sftp 要慢慢找到路径再打开文件编辑 SFTP ⭐ 最终解决方案在服务器上对应的文件夹下创建软链就 ok 了,比如安装后是在 site-packages 下,但是可以把代码上传到 /root/source/ 然后创建一个软链到 site-packages 插件配置 sftp.json 12345678910111213141516171819{ "name": "xxx", "host": "xxx.xxx.xxx.xxx", // 服务器IP "protocol": "sftp", "port": 22, "username": "root", // 登录用户名 "password": "xxxxxxxx", // 登录密码 // 在工作空间的文件夹上右键上传,就会把文件上传到以下路径 // 如果源代码目录结构为 /A/B/xxx 而.vscode与B是【同级目录】 // 上传后远程服务器路径为 /root/source/B/xxx "remotePath": "/root/source", "uploadOnSave": false, "downloadOnOpen": false, "ignore": [ ".vscode", ".git", ".DS_Store" ]} 创建软链 1234567# 库cd /usr/lib/python2.7/site-packages/ln -s /root/source/B/xxx/lib/python/xxxlib# 如果 xxxlib 中还包含其他目录的代码,也一样创建软链到xxxlib下就可以了cd /root/source/B/xxx/lib/python/xxxlibln -s /root/source/B/source/src/daemon/xxxx 配置之后就可以愉快地在本地打开源代码进行编辑,编辑完成之后右键UPLOAD就可以替换上去了,当然也可以设置本地保存立即上传,最关键的是通过 软链 来解决了项目代码结构和服务器代码结构不一致的问题]]></content>
<categories>
<category>开发环境</category>
</categories>
<tags>
<tag>vscode</tag>
<tag>python</tag>
</tags>
</entry>
<entry>
<title><![CDATA[vscode+wsl搭建go和c++开发环境]]></title>
<url>%2F2019%2F04%2F17%2Fvscode%2Bwsl%E6%90%AD%E5%BB%BAgo%E5%92%8Cc%2B%2B%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%2F</url>
<content type="text"><![CDATA[使用场景 操作步骤 开启 wsl,并配置为 vscode 默认终端 通过 bat 执行 bash 命令 task.json launch.json 使用说明 make 工程 配置 go 使用场景借助 wsl 在 windows 下进行 linux 环境开发 操作步骤开启 wsl,并配置为 vscode 默认终端 网上很多方法,这里不赘述 通过 bat 执行 bash 命令 装上 WSL 后,可以在 bash 下执行命令,但是如果想在 windows 系统下做开发的话,不能直接执行 bash 命令 可以通过 cmd 批处理命令来调用 bash 并执行 shell 命令,使用方法如下: 1C:\Users\User_Name>bash -c " ls ~/" 写个批处理命令,来实现 windows 下用 vscode 写代码,然后在 wsl 下编译运行代码,这里路径有个问题,windows下路径是右斜杠,而linux下是左斜杠,所以利用批处理把右斜杠替换成左斜杠 123set cpp_path=%1set "cpp_path=%cpp_path:\=/%"bash -c "rm -f %2 && g++ --std=c++11 -g %cpp_path% -o %2 -lpthread && clear && time %2" task.json 下面注释部分按照实际情况改写12345678910111213141516171819202122232425262728293031{ "version": "2.0.0", "tasks": [ { "label": "make", // ctrl + shift + b 调出vscode task的时候显示的名称 "command": "${workspaceFolder}/.vscode/make.bat", // make.bat的路径 "args": [ // 传递给make.bat的参数 %1和%2 "${relativeFile}", // 当前打开文件的路径 "./debug/${fileBasenameNoExtension}.out" // 编译后文件输出路径 ], "problemMatcher": { "owner": "cpp", "fileLocation": ["relative", "${workspaceRoot}"], "pattern": { "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$", "file": 1, "line": 2, "column": 3, "severity": 4, "message": 5 } }, "group": { "kind": "build", "isDefault": true } } ], "sourceFileMap": {}} launch.json 下面注释部分按照实际情况改写12345678910111213141516171819202122232425262728293031323334353637383940{ "version": "0.2.0", "configurations": [ { "name": "(gdb)", "type": "cppdbg", "request": "launch", "program": "${fileBasenameNoExtension}.out", "args": [ // 调试时送给程序的参数相当于gdb中的 set args xxx "test.log", "100" ], "stopAtEntry": true, // 设为true时程序将暂停在程序入口处 "cwd": "/mnt/f/workspaces/c++/debug", // 调试程序时的工作目录 "environment": [], "externalConsole": true, "internalConsoleOptions": "openOnSessionStart", "sourceFileMap": { "/mnt/f/workspaces/c++/": "${workspaceFolder}" // 路径映射,修改路径为实际路径 }, "windows": { "MIMode": "gdb", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ] }, "pipeTransport": { "pipeCwd": "", "pipeProgram": "c:\\Windows\\System32\\bash.exe", "pipeArgs": ["-c"], "debuggerPath": "/usr/bin/gdb" } } ]} 使用说明 一键 F5 编译运行编译的时候实际就是通过 cmd 去执行 bash 命令,上面的例子中是先把 debug 下的 .out 删除,然后编译运行,可以直接在 vscode 的终端中看到运行结果 make 工程 大点的工程都有 makefile,方法和上面的一样,只要改一下 make.bat就行了1bash -c "cd src && make clean && make %1" 配置 go make.bat 1bash -c "go run %1" task.json 1234567891011121314151617181920212223242526272829{ "version": "2.0.0", "tasks": [ { "label": "go", // 显示 "command": "${workspaceFolder}/.vscode/make.bat", // make.bat路径 "args": [ "/mnt/f/workspaces/go/${relativeFile}" // make.bat 的入参 ], "problemMatcher": { "owner": "go", "fileLocation": ["relative", "${workspaceRoot}"], "pattern": { "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$", "file": 1, "line": 2, "column": 3, "severity": 4, "message": 5 } }, "group": { "kind": "build", "isDefault": true } } ], "sourceFileMap": {}} launch.json 1234567891011121314151617181920{ "version": "0.2.0", "configurations": [ { "name": "golang", "type": "go", "request": "launch", "mode": "debug", "remotePath": "", "port": 2345, "host": "127.0.0.1", // "program": "${relativeFile}.go", "program": "${workspaceRoot}/${relativeFile}", "env": { "gopath": "F:\\workspaces\\golang" }, // $GOPATH路径 "args": [], "showLog": true, "trace": true } ]}]]></content>
<categories>
<category>开发环境</category>
</categories>
<tags>
<tag>vscode</tag>
<tag>wsl</tag>
<tag>c++</tag>
</tags>
</entry>
<entry>
<title><![CDATA[记一次Segment fault]]></title>
<url>%2F2019%2F04%2F14%2F%E8%AE%B0%E4%B8%80%E6%AC%A1Segment%20fault%2F</url>
<content type="text"><![CDATA[重现 功能描述把 test.log 文件每一行按照 , 进行切片,将一行中的所有分片存放到 string 数组中 样例test.log 中有很多行如下字符串 1home,m_kepler,project 目的是按照,切割,把子串存放到 string 数组中 1234string strTmp[3];strTmp[0] = "home"strTmp[1] = "m_kepler"strTmp[2] = "project" 出错的代码这里不用 strtok 是因为 ,, 也要算一个数据 123456789101112131415161718192021fstream test;char delim[] = ",";string strLine;string szstrTmp [3];test.open("./debug/test.log", ios::binary | ios::in);if(!test) perror("open");while(getline(test, strLine)){ int i = 0; // error1 char *orgstr = strdup(strLine.c_str()); // error2 for (token = strsep(&orgstr, delim); token != NULL; token = strsep(&orgstr, delim)) { szstrTmp[i] = token; i++; } free(orgstr);}return 0; 分析 像下面这样把两个循环条件才出来,运行报错 Segmentation fault (core dumped) 12345678910string szstrTmp[3];while(getline(test,line)){ int j =0; for(int i =0; i < 10; i++) { szstrTmp[j] = "aaaa"; // gdb 调试报错此行 j++; }} 在 while 循环中使用 strdup,运行报错 munmap_chunk(): invalid pointer 1234567891011string szstrTmp[3];while(getline(test, line)){ int i = 0; char *orgstr = strdup(line.c_str()); for (token = strsep(&orgstr, delim), i = 0; token != NULL, i != 3; token = strsep(&orgstr, delim), i++) { szstrTmp[i] = token; } free(orgstr); // gbd 调试报错在此行} 修复 不使用 strdup 、for 循环里多个条件限制 修复后的代码 12345678910111213141516171819202122232425fstream test;int i = 0; // ++++++char delim[] = ",";string strLine;string szstrTmp [3];test.open("./debug/test.log", ios::binary | ios::in);if(!test) perror("open");while(getline(test, strLine)){ // int i = 0; // error1 // ------ // char *orgstr = strdup(strLine.c_str()); // error2 // ------ char *orgstr = const_cast<char*>(strLine.c_str()); // for (token = strsep(&orgstr, delim), i = 0; token != NULL; token = strsep(&orgstr, delim)) // ------ for (token = strsep(&orgstr, delim), i = 0; token != NULL, i < 3; token = strsep(&orgstr, delim), i++) // ++++++ { szstrTmp[i] = token; // i++; // ------ } // free(orgstr); // ------}return 0;]]></content>
<categories>
<category>Other</category>
</categories>
<tags>
<tag>Bug</tag>
</tags>
</entry>
<entry>
<title><![CDATA[Hello World]]></title>
<url>%2F2019%2F04%2F13%2Fhello-world%2F</url>
<content type="text"><![CDATA[quote test 结合hexo在GitHub上搭建个人博客——全过程 Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub. Quick StartCreate a new post1$hexo new "My New Post" More info: Writing Run server1$hexo server More info: Server Generate static files1$hexo generate More info: Generating Deploy to remote sites1$hexo deploy More info: Deployment]]></content>
<categories>
<category>Other</category>
</categories>
<tags>
<tag>Other</tag>
</tags>
</entry>
</search>