惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
V
V2EX
WordPress大学
WordPress大学
U
Unit 42
I
InfoQ
A
About on SuperTechFans
宝玉的分享
宝玉的分享
J
Java Code Geeks
博客园 - 司徒正美
爱范儿
爱范儿
Engineering at Meta
Engineering at Meta
G
Google Developers Blog
人人都是产品经理
人人都是产品经理
小众软件
小众软件
Microsoft Security Blog
Microsoft Security Blog
L
LangChain Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Hugging Face - Blog
Hugging Face - Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
aimingoo的专栏
aimingoo的专栏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Last Week in AI
Last Week in AI
腾讯CDC
Recent Announcements
Recent Announcements

博客园 - 咸着的鱼25

环境才是 Agent 的核心基础设施 OpenCode + OpenSpec + Oh-My-OpenCode 联合 SDD/ATDD 开发指南 AI 驱动开发工作流:OpenCode + Oh-My-OpenCode + SDD + ATDD 在线服务数据压缩算法比较 延迟深度链接 搭建wiki系统后端存储-来自大模型 广告投放名词 java spring IoC原理 面试题1 c++ 代码技巧 c++ 性能分析 粗排治理之性能优化 MMR 算法优化 聊天室开发心得 Docker 学习笔记 Airflow 使用简介 lua转换etcd应答 修改系统参数 https学习笔记 openresty: nginx worker不同请求之间共享数据
core 基本操作
咸着的鱼25 · 2021-10-29 · via 博客园 - 咸着的鱼25

1. 保存core dump文件

默认linux系统的core dump可能没有打开,因为core dump文件很大,会大量占用机器资源。为了保存core dump文件,需要运行前设置 ulimit -c unlimited
core文件会保存在当前目录下,并且只对当前终端有效,可以用命令修改core文件位置 sudo sysctl -w kernel.core_pattern=/tmp/core-%e.%p.%h.%t

2. backtrace辅助排查

线上服务一般占用内存较大,出core时,dump非常慢,gdb加载的时候也很慢。而大多数场景的core,结合堆栈和代码就可以确定。可以选择通过捕获信号、backtrace打印堆栈来辅助排查问题。

#include <signal.h>
#include <iostream>
#include <stdio.h>
#include <execinfo.h>

void handler(int sig) {
void *array[64];
int size = backtrace(array, 64);
std::cout << "Error: sig: " << sig << std::endl;
char** address = backtrace_symbols(array, size);

for (int i = 0; i < size; i++) {
  std::cout << i << " : " << address[i] << std::endl;
}
free(address);
}

void baz() {
::raise(SIGABRT);
}

void bar() {
baz();
}

void foo() {
bar();
}

int main(void) {
::signal(SIGSEGV, &handler);
::signal(SIGABRT, &handler);

foo();
return 0;
}

这个代码会捕获abort信号,并将堆栈打印到标准输出。
执行编译 g++ core_backtrace.cpp -o ba -ggdb -rdynamic
运行结果:

这种实现方式不能应用到线上。线上可以直接使用boost实现的方法来打印到文件中。

    #include <signal.h>
    ::signal(SIGSEGV, &my_signal_handler); //发SIGSEGV信号
    ::signal(SIGABRT, &my_signal_handler); //发SIGABRT信号
    //捕获处理信号
    #include <signal.h>
    #include <boost/stacktrace.hpp>
    void my_signal_handler(int signum) {
        ::signal(signum, SIG_DFL);
        boost::stacktrace::safe_dump_to("./backtrace.dump");
        ::raise(SIGABRT);
    }