coredump
当程序发生内存越界访问等行为时,会触发OS的保护机制,此时OS会产生一个信号(signal)发送给对应的进程。当进程从内核态到用户态切换时,该进程会处理这个信号。此类信号(比如SEGV)的默认处理行为生成一个coredump文件。
配置coredump
/proc/sys/kernel/core_pattern 指定core文件存储的位置,缺省值是core,表示将core文件存储到当前目录。这个pattern是可以定制的,模式如下:
%p 出Core进程的PID %u 出Core进程的UID %s 造成Core的signal号 %t 出Core的时间,从1970-01-0100:00:00开始的秒数 %e 出Core进程对应的可执行文件名
/proc/sys/kernel/core_uses_pid 取值是0或者1,表示是否在core文件名字后面加上进程号
ulimit -c 决定save的core文件大小限制. 如果不想限制大小,需要设置ulimit -c unlimited
Example
调用纯虚函数导致abort()
#include <iostream>
class Base {
public:
Base(Base *pa){pa->f();}
virtual void f()=0;
};
class Class : public Base {
public:
Class():Base(this){}
virtual void f() {std::cout<<"Class::f\n";}
};
int main(int argc, char** argv) {
Class d;
Base *pa = &d;
pa->f();
return 0;
}
构造函数中不可以使用虚函数。构造函数中使用虚函数,在语法上是正确的,但是在语义上是错误的。因为一个C++对象在构造构成中,虚函数表的绑定是动态的,可能需要有多次绑定的过程。第一次绑定是从第一层Base类开始的。
lscpu
lscpu 或者cat /proc/cpuinfo 可以查看cpu信息和每个核信息。
uptime
uptime会在一行中当前时间、系统运行了多久时间、当前登录的用户有多少,以及前 1、5 和 15 分钟系统的平均负载。
系统负载是处于可运行runnable或不可中断uninterruptable状态的进程的平均数。可运行状态的进程要么正在使用 CPU 要么在等待使用 CPU。 不可中断状态的进程则正在等待某些 I/O 访问,例如等待磁盘 IO。 有三个时间间隔的平均值。负载均值的意义根据系统中 CPU 的数量不同而不同,负载为 1 对于一个只有单 CPU 的系统来说意味着负载满了,而对于一个拥有 4 CPU 的系统来说则意味着 75% 的时间里都是空闲的。
stress
stress是一个施加系统压力和压力测试系统的工具,我们可以使用stress工具压测试 CPU,以便方便我们定位和排查 CPU 问题。
// --cpu 8:8个进程不停的执行sqrt()计算操作
// --io 4:4个进程不同的执行sync()io操作(刷盘)
// --vm 2:2个进程不停的执行malloc()内存申请操作
// --vm-bytes 128M:限制1个执行malloc的进程申请内存大小
stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10s
mpstat pidstat
使用sudo apt-get install sysstat安装。
使用mpstat -P ALL 1则可以查看每一秒的 CPU 每一核变化信息,整体和top类似,好处是可以把每一秒(自定义)的数据输出方便观察数据的变化,最终输出平均数据。
使用pidstat -u 1则是每隔 1 秒输出当前系统进程、CPU 数据。
Reference
[1] https://man7.org/linux/man-pages/man7/signal.7.html [2] https://perf.wiki.kernel.org/index.php/Tutorial [3] http://www.brendangregg.com/linuxperf.html