linux生成coredump文件

文章讲述了如何设置Linux系统使程序产生coredump文件,包括使用sysctl命令修改kernel.core_pattern来指定core文件路径,并通过intEnableCoredumpFile函数利用prctl和setrlimit函数控制进程是否允许生成coredump及限制其大小。

1、sysctl -w kernel.core_pattern=/home/corefiles/core.%h.%p.%e.%t >/dev/null

2、

int EnableCoredumpFile(bool enable)
{
    struct rlimit rl;
    int dumpable;

    if (enable) {
        dumpable = 1;
        rl.rlim_cur = RLIM_INFINITY;
        rl.rlim_max = RLIM_INFINITY;
    } else {
        dumpable = 0;
        rl.rlim_cur = 0;
        rl.rlim_max = 0;
    }

    if (prctl(PR_SET_DUMPABLE, dumpable) == -1) {
        return -1;
    }

    if (setrlimit(RLIMIT_CORE, &rl) == -1) {
        return -1;
    }

    return 0;
}

<think> 我们被要求回答:在Linux系统中查看coredump生成文件地址的方法 根据引用内容,我们可以总结如下: 1. 引用[1]提到可以通过`/proc/sys/kernel/core_pattern`文件来设置coredump生成路径和文件名格式。 2. 引用[2]和[3]都提到了`core_pattern`文件的作用,它定义了coredump文件的命名和存储位置。 3. 引用[4]展示了使用gdb调试coredump文件的例子,但未直接说明如何查看生成地址。 因此,查看coredump文件生成地址的方法主要是通过查看系统配置的`core_pattern`文件。 具体步骤: 1. 查看当前系统的core_pattern配置: ```bash cat /proc/sys/kernel/core_pattern ``` 这个文件的内容可能是: - 一个绝对路径(如`/var/coredump/core.%e.%p`),那么coredump文件就会保存在这个路径下。 - 如果是以`|`开头,则表示通过管道将coredump传递给一个程序(如`|/usr/share/apport/apport %p %s %c %d %P`),这种情况下不会生成文件,而是由程序处理。 2. 如果`core_pattern`中使用了相对路径,那么coredump文件生成在进程的当前工作目录(通常是程序启动时所在的目录)。 3. 另外,也可以使用`sysctl`命令查看: ```bash sysctl kernel.core_pattern ``` 4. 如果配置中包含了变量(如`%e`表示程序名,`%p`表示进程ID等),那么实际生成文件名会包含这些变量替换后的值。 5. 如果没有生成coredump文件,还需要检查是否设置了coredump大小限制(使用`ulimit -c`),必须设置成非零值(如`unlimited`)才能生成。 因此,要查看coredump文件生成地址,首先需要查看`core_pattern`的配置,然后根据配置中的路径和文件名模式去对应目录查找。 注意:如果`core_pattern`配置为通过管道传递给其他程序,那么需要查看该程序的配置才能知道它把coredump文件存储在哪里(如果有存储的话)。 举例: 如果`core_pattern`的内容为:`/tmp/core-%e-%p`,那么当程序`test`(进程ID为1234)崩溃时,coredump文件将保存在`/tmp/core-test-1234`。 总结步骤: 1. 检查`core_pattern`以确定存储路径和文件名模式。 2. 检查`ulimit -c`设置,确保已开启coredump生成。 3. 根据`core_pattern`中的路径和模式,在相应目录中查找。 如果用户配置了将coredump发送到应用程序(如`apport`),则需要查阅该应用程序的文档以确定存储位置。 在回答中,我们引用相关引用内容来支持我们的步骤。 注意:引用标识要自然添加在段落末尾。 生成相关问题。 </think>在 Linux 系统中查看 coredump 文件生成地址的方法如下: ### 查看 coredump 文件路径的方法 #### 1. **检查核心转储配置** 核心转储路径由 `/proc/sys/kernel/core_pattern` 文件控制: ```bash cat /proc/sys/kernel/core_pattern ``` - **输出示例**: - `/var/coredump/core.%e.%p` → 表示存储到 `/var/coredump/` 目录 - `core` → 表示生成在当前工作目录 - `|/usr/bin/apport %p %s %c` → 表示通过管道传递给其他程序处理[^3] #### 2. **理解路径格式符** `core_pattern` 支持动态格式符: ```bash # 常用格式符: # %e = 可执行文件名 # %p = 进程ID # %t = 崩溃时间戳 # %h = 主机名 grep core_pattern /usr/src/linux/Documentation/sysctl/kernel.txt ``` 例如 `core.%e.%p.%t` 会生成类似 `core.bash.1234.1698765432` 的文件名[^1][^3] #### 3. **检查默认存储位置** 若未配置 `core_pattern` 或显示 `core`: ```bash # 1. 检查程序崩溃时的工作目录 pstree -p | grep <崩溃程序名> # 2. 在可能目录中搜索 find / -name "core*" -mtime -1 2>/dev/null # 查找24小时内创建的core文件 ``` #### 4. **验证转储功能状态** 确保系统允许生成 coredump: ```bash # 检查资源限制 ulimit -c # 返回 unlimited 表示无限制 cat /proc/sys/kernel/core_uses_pid # 1=文件名包含PID ``` ### 配置修改示例 #### 设置专用存储目录: ```bash # 1. 创建目录 sudo mkdir /var/coredump sudo chmod 777 /var/coredump # 2. 修改配置 echo "/var/coredump/core.%e.%p" | sudo tee /proc/sys/kernel/core_pattern # 3. 永久生效(大多数系统) echo "kernel.core_pattern=/var/coredump/core.%e.%p" | sudo tee -a /etc/sysctl.conf sudo sysctl -p ``` #### 测试验证: ```bash # 触发段错误 kill -s SIGSEGV $$ # 当前shell崩溃 ls /var/coredump/core.bash.* # 查看生成文件 ``` > 📌 **注意**:若 `core_pattern` 以 `|` 开头(如 Ubuntu 的 apport),需检查对应服务日志确认实际存储位置[^3]。 ### 图形化工具定位 使用 `gdb` 调试时自动显示路径: ```bash $ gdb -c /path/to/coredump [New LWP 2199] Core was generated by `./program'. # 此处显示原程序路径 Program terminated with signal SIGSEGV... (gdb) ``` [^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值