营销型网站建设主要需要注意什么,做网站用什么压缩代码和图片,宝安网站建设深圳信科,展厅展馆策划设计最近在尝试使用Visual Studio 2022远程连接Linux进行C/C的开发#xff0c;由于CentOS风波不断#xff0c;所以现在的开发基本上都是使用ubuntu了#xff0c;但是目前VS2022有一些BUG#xff0c;就是远程调试时#xff0c;如果目标系统是ubuntu则会出现启动调试器很慢的问题…最近在尝试使用Visual Studio 2022远程连接Linux进行C/C的开发由于CentOS风波不断所以现在的开发基本上都是使用ubuntu了但是目前VS2022有一些BUG就是远程调试时如果目标系统是ubuntu则会出现启动调试器很慢的问题基本上要超过20秒甚至更久笔者试过几个ubuntu系统了不管是实体机虚拟机还是容器只要是ubuntu系统都存在这样的问题向MS提了BUG了官方还在考虑中不知道是否修复啥时候修复。
CentOS系统则不存在很慢的问题所以笔者在容器中安装了CentOS7由于CentOS系统对软件的更新是比较慢的所以想要使用C的新特性比如C17甚至C20则需要自己安装新的编译器和调试器。
笔者在CentOS7安装了最新的GCC13.2、GDB13.2和llvm 16.0.6(包括clang、lld、lldb等)。使用下来GCC以及GDB都没发现问题clang/clang编译链接也没发现问题只有lldb在调试时报了personality set failed: Function not implemented查看lldb的源码发现是在文件source\Host\posix\ProcessLauncherPosixFork.cpp:69的DisableASLR函数报的错误源码
static void DisableASLR(int error_fd) {
#if defined(__linux__)const unsigned long personality_get_current 0xffffffff;int value personality(personality_get_current);if (value -1)ExitWithError(error_fd, personality get);value personality(ADDR_NO_RANDOMIZE | value);if (value -1)ExitWithError(error_fd, personality set);
#endif
}即执行personality(ADDR_NO_RANDOMIZE | value)失败关于personalityA tour of Linux syscall personality有一个简单的介绍。
lldb报personality set failed: Function not implemented即是personality函数没有实现。可以写一个简单的程序
#include stdlib.h
#include iostream
#include sys/personality.hstatic void ExitWithError(int error_fd,const char* operation) {int err errno;std::cout strerror(err) std::endl;exit(1);
}int main()
{int error_fd 0;const unsigned long personality_get_current 0xffffffff;int value personality(personality_get_current);if (value -1)ExitWithError(error_fd, personality get);value personality(ADDR_NO_RANDOMIZE | value);if (value -1)ExitWithError(error_fd, personality set);return 0;
}来进行测试。
personality函数的实现是在glibc中CentOS7的glibc是2.17版本的
Ubuntu的glibc是2.35的比较新目前最新的glibc是2.38经过测试没这样的问题所以CentOS7的版本是太老了。 可能有读者想到了升级glibc可是可以但是风险非常大因为glibc是整个系统非常基础的库一旦出问题则会导致系统崩溃。笔者就在容器中尝试升级到2.38发现编译不过报错../sysdeps/x86_64/multiarch/memchr-evex-base.S:229: Error: no such instruction: vpcmpneqb (64 * 4)(%rdi),%zmm17,%k12.36、2.37都是这样的错。2.35在添加了参数--disable-werror后编译通过了但是安装后常用的命令都不能使用了不兼容系统崩溃不能再启动。所以一定要慎重升级glibc库特别是物理机上。
在lldb源码source\Commands\CommandObjectProcess.cpp:188中有提到使用settings target.disable-aslr来进行开关即在lldb中先执行settings set target.disable-aslr 0即可 不能每次都手动输入为了方便可以将命令写入到~/.lldbinit文件中每次lldb启动时自动执行。
转载请标明出处。