linux疑难问题排查实战,分享了作为公司专家,在项目开发过程中内存优化(堆、栈、代码段、数据段)、性能优化、死机(栈越界、堆越界)、死锁等疑难问题排查的案例、使用的工具(perf、asan、strace、memleak等)、工作经验,大家可以点开看一下,如果觉得有用可以关注一下,认真学习相信可以让你在日后工作中大放光彩。
一、Linux下控制台文字上色的方法
Linux下控制台颜色是通过添加专用数字来选择的。这些数字夹在 "\e["和 "m"之间。如果指定一个以上的数字,则用分号将它们分开。
举几个例子:
(1)第一个数字(31)为前景颜色(红色);第二个数字为(42)背景颜色(绿色)
echo -e "\e[31;42m"
(2)使用"\e[0m"序列将颜色重新设置为正常值
每条打印之后都需要及时取消,否则后面的所有打印都会设置为这个属性
echo -e "\e[0m" 或 echo -e "\033[0m"
(3)颜色对应关系如下所示:
\e[30m – \e[37m 设置前景色(字体颜色)
字符 | 颜色 |
---|---|
30 | 黑色 |
31 | 红色 |
32 | 绿色 |
33 | 黄色 |
34 | 蓝色 |
35 | 紫色 |
36 | 深绿 |
37 | 白色 |
\e[40m – \e[47m 设置背景色
字符 | 颜色 |
---|---|
40 | 黑色 |
41 | 红色 |
42 | 绿色 |
43 | 黄色 |
44 | 蓝色 |
45 | 紫色 |
46 | 深绿 |
47 | 白色 |
一些屏幕控制ASCII字符:
字符 | 动作 |
---|---|
0 | 关闭所有属性 |
1 | 设置高亮度 |
4 | 下划线 |
5 | 闪烁 |
7 | 反显 |
8 | 消隐 |
字符 | 动作 |
---|---|
nA | 光标上移n行 |
nB | 光标下移n行 |
nC | 光标右移n行 |
nD | 光标左移n行 |
y; xH | 设置光标位置 |
2J | 清屏 |
K | 清除从光标到行尾的内容 |
s | 保存光标位置 |
u | 恢复光标位置 |
?25l | 隐藏光标 |
?25h | 显示光标 |
具体到编程中,printf() 颜色设置示例代码如下所示。
demo1:
printf("\e[31m\e[42m Hello World. \e[0m \n"); // 红色字体,绿色背景
demo2:
打印颜色为绿色并且闪烁:
printf("\033[32;5mHelloWorld\033[0m\r\n");
实际效果:
二、Windows下控制台文字上色的方法
Windows下控制台颜色是通过SetConsoleTextAttribute()函数完成的。SetConsoleTextAttribute()函数的原型如下所示。
BOOL SetConsoleTextAttribute(HANDLE hConsoleOutput, WORD wAttributes);
其中2个参数的含义如下所示:
- hConsoleOutput:指向控制台的句柄。
- wAttributes:文本属性。
hConsoleOutput可以选择以下3种句柄: - STD_INPUT_HANDLE: 标准输入的句柄
- STD_OUTPUT_HANDLE: 标准输出的句柄
- STD_ERROR_HANDLE: 标准错误的句柄
wAttributes可以控制前景色和背景色:
- FOREGROUND_BLUE: 字体颜色:蓝
- FOREGROUND_GREEN: 字体颜色:绿
- FOREGROUND_RED: 字体颜色:红
- FOREGROUND_INTENSITY: 前景色高亮显示
- BACKGROUND_BLUE: 背景颜色:蓝
- BACKGROUND_GREEN: 背景颜色:绿
- BACKGROUND_RED: 背景颜色:红
- BACKGROUND_INTENSITY 背景色高亮显示
demo如下:
#include <stdio.h>
#include <windows.h>
int main()
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);
printf("red\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);
printf("green\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE);
printf("blue\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED|FOREGROUND_GREEN);
printf("red+green=yellow\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED|FOREGROUND_BLUE);
printf("red+blue=purple\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN|FOREGROUND_BLUE);
printf("green+blue=cyan\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED|BACKGROUND_GREEN);
printf("Add background\n");
return 0;
}
运行结果如下: