记录下这段时间经常用到的一些 shell 命令。
1. 如何对某个二进制可执行程序进行稳定性测试:用 shell 循环执行:
count=0
while true; do
((count++))
echo "start running. count=$count"
# 在此处替换为您要循环运行的命令
./demo-test
# 获取上一个命令的退出状态码
exit_status=$?
if [[ $exit_status -ne 0 ]]; then
echo "Command exited with non-zero status ($exit_status). Possible core dump error."
break
fi
# 添加100毫秒的延迟
sleep 0.1 # 100毫秒延迟
done
2. 调试:二进制可执行程序报错,如何定位原因?
首先,确保可执行程序带有调试信息
通过 file 命令可以查看可执行程序的详细信息,如果有“with debug_info, not stripped”,说明带有调试信息。
可以修改 CMakeLists.txt , 添加如下配置:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
设置ulimit的值
先在控制台用ulimit -c 查看当前的设置的值,如果是0,则需要设置成 unlimited。
ulimit -c unlimited
ulimit -c 命令用于控制或查询当前shell会话的核心转储文件大小限制。核心转储文件是当程序崩溃时操作系统生成的文件,包含了程序在崩溃时的内存映像、寄存器状态和其他调试信息。核心转储文件可以用于调试和诊断程序崩溃的原因。
修改 core 文件的命名格式
/proc/sys/kernel/core_pattern 文件的内容决定了核心转储文件的生成位置和命名格式。当系统中的程序崩溃并生成核心转储文件时,该文件的内容指定了核心转储文件的路径和名称格式。
cat /proc/sys/kernel/core_pattern
echo "./core-%e-%p-%s" > /proc/sys/kernel/core_pattern
如何使用 gdb 查看报错位置:
经过上面的设置,程序报错后就能自动生成 core 文件了。然后就可以利用 gdb 查看 core文件里的报错堆栈:
gdb {可执行程序} {core文件}
然后输入 bt 即可查看报错位置
疑惑:有时候看不到报错堆栈,只能看到一堆问号,不知道为什么。
4. 按关键字过滤 top 的结果,采集某个程序的 cpu 数据和内存数据:
top -b -d 1 | awk '{print strftime("%Y-%m-%d_%H:%M:%S"), $0}' | grep --line-buffered {要过滤的关键字} >> 1.txt
5. 常用的压缩和解压缩的shell脚本(总是记不住)
tar 压缩
tar -czvf archive.tar.gz /path/to/directory
tar解压缩
tar -xzvf archive.tar.gz
zip压缩文件夹
zip -r archive.zip /path/to/directory
6. jemalloc 可以优化一点性能
原理是: 通过LD_PRELOAD拦截malloc的实现.
LD_PRELOAD="/home/test/libjemalloc.so" ./demo
7. 让程序在单核上运行
ubuntu 系统:
taskset -c 0 ./demo
qnx 系统:
on -C0 ./demo
数字0表示第1个核。
8. 如何排查 curl 访问服务接口失败的问题?
SSL 错误:
可能是什么原因?
- 系统时间错误;
- 如果设置了证书,看看证书路径是否有效;
- 看看域名能否 ping 通;全局的 dns 和代码里设置的 dns是否有效;
Unsupported protocol 错误
在代码里打印 curl 所支持的协议,看看有没有 https:
curl_version_info_data *ver;
const char *const *ptr;
ver = curl_version_info(CURLVERSION_NOW);
printf("Protocols:\n");
for(ptr = ver->protocols; *ptr; ++ptr)
printf(" %s\n", *ptr);
std::cout<<std::endl;