记录 Java 转 C++ 开发时遇到的那些“坑”(三)——命令篇

109 阅读3分钟

记录下这段时间经常用到的一些 shell 命令。

1. 如何对某个二进制可执行程序进行稳定性测试:用 shell 循环执行:

count=0
while truedo
   ((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;