VCode 卡死问题,有个小

VCode相对比较轻量级,也挺好用。可是不知道什么情况,一到VCode后台执行等待升级,系统界面就开始卡死,不知道是哪个同学的杰作?! 本来我也不知道是VCode搞的鬼,也没有绝对的证据,但是一次次的场景都指向VCode升级。

历时大概一年之久,升级卡死界面的问题一直没有解决。不知道腾讯测试人员的case场景是不是有缺陷?——马总要问问你们都干嘛去了?

真的是郁闷………….,所以才来这里吐槽,希望好好测下,赶快解决,是软件有bug都可以原谅,不可原谅的是这么久没发现没解决。

==== 在一次次的郁闷中总结出来了不算特别完美的解决方法,至少不用再强制重启了,供读者参考。=====

——————现象是?

在使用过程中,当前窗口界面突然卡死,无法拖动和关闭,切换到VCode可以写代码,但是VCode窗口死了,拖不了关闭了。这个时候即使调出任务管理器,也只能看到在动,但是窗口是假死的,没办法杀死卡死窗口进程。

后来通过特殊方法定位到应该是 CodeSetup-stable-xxxxx.exe 和 CodeSetup-stable-xxxxx.tmp在等待执行, 名字真的很好,稳稳的卡死,像是有个钩子函数把任务管理器都搞残了。————相当高明的操作,这下你得乖乖的按电脑的强制重启按钮了吧?!!哈哈哈,我也是这样操作过几次,还好文档什么的都是实时保存,而且现在的word什么的都有恢复功能,但是心里是一万只草泥马。

相对好点的解决方式是你让我关机我就关机,但是通过注销方式关机,此时系统询问是否强制关机,先点是,但是注意了,在看到系统kill掉了VCode的安装进程后立马点取消。这样系统就不卡了,还能留下一些原先打开的程序。——真是山重水复疑无路

,柳暗花明又一村!

在一次次的注销操作中,你都可以妥妥的看到Visual studio Code 正在等待安装几个字样, 贴图:

别高兴太早,恢复不卡后,VCode等待安装的进程还是会被启动,所以赶快关闭VCode让它更新完

关于connect函数超时太久的问题

解决方案思想: 通过把socket设置为非阻塞模式,然后通过select函数自己设置定时,检测套接字描述符是否可用。

windows端实现上代码: 过于粗略,仅呈思想
#include <winsock2.h>
#include <Windows.h>
#include <conio.h>
//#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
//#include <netinet/in.h>
//#include <arpa/inet.h>
//#include <sys/ioctl.h>
#include <stdarg.h>
//#include <fcntl.h>
#include <time.h>
int main(int argc, char *argv[])
{undefined
printf(“==main===\n”);fflush(stdout);
//Winsows下启用socket
WSADATA wsadata;
if (WSAStartup(MAKEWORD(1, 1), &wsadata) == SOCKET_ERROR) {undefined
printf(“WSAStartup() fail\n”);fflush(stdout);
exit(0);
}
printf(“==WSAStartup ok ===\n”);fflush(stdout);
int sockClient = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addrSrv;
addrSrv.sin_addr.s_addr = inet_addr(argv[1]);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(atoi(argv[2]));
//fcntl(sockClient, F_SETFL, fcntl(sockClient, F_GETFL, 0)|O_NONBLOCK);
printf(“==goto ioctlsocket ok ===\n”);fflush(stdout);
unsigned long ul=1;
int ret=ioctlsocket(sockClient,FIONBIO,(unsigned long *)&ul); //设置成非阻塞模式
if(ret==SOCKET_ERROR) //设置失败
{undefined
printf(“socket ioctl error%d\n”, WSAGetLastError());fflush(stdout);
return -10;
}
printf(“==set sucess to connect===\n”);fflush(stdout);
int iRet = connect(sockClient, ( const struct sockaddr *)&addrSrv, sizeof(struct sockaddr_in));
printf(“connect iRet is %d, errmsg:%s\n”, iRet, strerror(errno));
fflush(stdout); // 返回-1不一定是异常
if (iRet != 0)
{undefined
/*
if(errno != EINPROGRESS)
{undefined
printf(“connect error:%s\n”, strerror(errno)); fflush(stdout);
}
else
*/
{undefined
printf(“socket ===========\n”);
struct timeval tm = {5, 0};
fd_set wset, rset;
FD_ZERO(&wset);
FD_ZERO(&rset);
FD_SET(sockClient, &wset);
FD_SET(sockClient, &rset);
int time1 = time(NULL);
int n = select(sockClient + 1, &rset, &wset, NULL, &tm);
int time2 = time(NULL);
printf(“time gap is %d\n”, time2 – time1);fflush(stdout);
if(n < 0)
{
printf(“select error, n is %d\n”, n); fflush(stdout);
}
else if(n == 0)
{
printf(“connect time out\n”); fflush(stdout);
}
else if (n == 1)
{undefined
if(FD_ISSET(sockClient, &wset))
{
printf(“connect ok!\n”); fflush(stdout);
//fcntl(sockClient, F_SETFL, fcntl(sockClient, F_GETFL, 0) & ~O_NONBLOCK);
}
else
{
printf(“unknow error:%s\n”, strerror(errno)); fflush(stdout);
}
}
else
{undefined
printf(“oh, not care now, n is %d\n”, n);fflush(stdout);
}
}
}
printf(“I am here!\n”);fflush(stdout);
//ioctlsocket(sockClient, FIONBIO, &ul); //设置为阻塞模式 阻塞时间为timeout时间
getchar();
closesocket(sockClient);

WSACleanup();
return 0;

}

linux端实现:
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <stdarg.h>
#include <fcntl.h>
#include <time.h>
int main(int argc, char *argv[])
{undefined
int sockClient = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addrSrv;
addrSrv.sin_addr.s_addr = inet_addr(argv[1]);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(atoi(argv[2]));
fcntl(sockClient, F_SETFL, fcntl(sockClient, F_GETFL, 0)|O_NONBLOCK);
int iRet = connect(sockClient, ( const struct sockaddr *)&addrSrv, sizeof(struct sockaddr_in));
printf(“connect iRet is %d, errmsg:%s\n”, iRet, strerror(errno)); // 返回-1不一定是异常

if (iRet != 0)
{
if(errno != EINPROGRESS)
{undefined
printf(“connect error:%s\n”, strerror(errno));
}
else
{undefined
struct timeval tm = {5, 0};
fd_set wset, rset;
FD_ZERO(&wset);
FD_ZERO(&rset);
FD_SET(sockClient, &wset);
FD_SET(sockClient, &rset);
int time1 = time(NULL);
int n = select(sockClient + 1, &rset, &wset, NULL, &tm);
int time2 = time(NULL);
printf(“time gap is %d\n”, time2 – time1);
if(n < 0)
{
printf(“select error, n is %d\n”, n);
}
else if(n == 0)
{
printf(“connect time out\n”);
}
else if (n == 1)
{undefined
if(FD_ISSET(sockClient, &wset))
{
printf(“connect ok!\n”);
fcntl(sockClient, F_SETFL, fcntl(sockClient, F_GETFL, 0) & ~O_NONBLOCK);
}
else
{
printf(“unknow error:%s\n”, strerror(errno));
}
}
else
{undefined
printf(“oh, not care now, n is %d\n”, n);
}
}
}
printf(“I am here!\n”);
getchar();
close(sockClient);
return 0;
}

————————————————
版权声明:本文为CSDN博主「字正腔圆」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fengdijiang/article/details/116779987

本文出自:https://blog.csdn.net/fengdijiang/article/details/116779987