插件安装
在 VSCode 中安装 clangd 作为前端,要记得关闭 C/C++的 Intellisense
生成 compile_commands.json
在 Ninja 输出目录,以out
为例,执行
ninja -C out -t compdb cxx cc > compile_commands.json
原创小于 1 分钟
在 VSCode 中安装 clangd 作为前端,要记得关闭 C/C++的 Intellisense
在 Ninja 输出目录,以out
为例,执行
ninja -C out -t compdb cxx cc > compile_commands.json
最近刷了几道 Leetcode,感觉没有补全写得太不舒服了,所以用 Leetcode 官方插件搭配 VSCode 写,用 xmake 构建,用 clangd 提供代码补全,写起来体验很好,但是还是有一个小问题
比如以下默认代码
// Definition for a binary tree node.
// struct TreeNode {
// int val;
// TreeNode *left;
// TreeNode *right;
// TreeNode() : val(0), left(nullptr), right(nullptr) {}
// TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
// TreeNode(int x, TreeNode *left, TreeNode *right)
// : val(x), left(left), right(right) {}
// };
class Solution {
public:
bool isValidBST(TreeNode *root) {}
};
起因是我正在 DragonOS 写 Signal 相关的代码,然后 Page fault 了,经过一系列排查之后,发现 RIP 寄存器的值好像不太对,把内核反编译之后发现确实不对,它没指向任何一个函数入口。到这一步,很自然的想法是栈损坏了,或者某些原因导致了 Dirty bit。这里先提一嘴,就是 DragonOS 里中断栈帧的 RIP 是 u64
,而 Signal 中的函数指针是 c_void
。后者在 rust 中打日志的时候会被格式化成十六进制。
后面我就想怎么回事呢,这个值不对。它是怎么个不对法呢,就是有如下代码,就是很简单的打日志
转载自美团技术团队
随着越来越多功能强大的高级语言的出现,在服务器计算能力不是瓶颈的条件下,很多同学会选择开发效率高,功能强大的虚拟机支持的高级语言(Java),或者脚本语言(Python,Php)作为实现功能的首选,而不会选择开发效率低,而运行效率高的 C/C++ 作为开发语言。而这些语言一般情况下是运行在虚拟机或者解释器中,而不需要直接跟操作系统直接打交道。