Rumah >Operasi dan penyelenggaraan >operasi dan penyelenggaraan linux >Apakah maksud teras linux?
Dalam Linux, Teras bermaksud ingatan. Apabila pengecualian dikesan semasa program sedang berjalan dan program keluar secara tidak normal, sistem menyimpan status memori semasa program dalam fail teras, dipanggil teras dibuang, yang juga merupakan lambakan maklumat apabila sistem pengendalian mengesan pengecualian dalam proses semasa, ia akan menggunakan isyarat memberitahu proses sasaran tentang maklumat ralat yang sepadan termasuk SIGSEGV, SIGBUS, dll. Secara lalai, proses mempunyai mekanisme pemprosesan yang sepadan apabila ia menerima isyarat yang sepadan.
Persekitaran pengendalian tutorial ini: sistem linux7.3, komputer Dell G3.
Apabila membangun di bawah Linux, kita sering mendengar pengaturcara mengatakan bahawa teras program saya telah jatuh Masalah seperti itu biasanya berlaku disebabkan oleh pepijat peringkat rendah seperti akses memori di luar sempadan, penggunaan penunjuk nol, limpahan timbunan. , dsb. Jika program keluar atau ditamatkan secara tidak normal semasa berjalan, fail teras akan dijana apabila syarat ini dipenuhi.
Mengapa Coredump berlaku
Teras bermaksud ingatan Perkataan ini berasal daripada bahan yang digunakan untuk membuat ingatan sejak dahulu lagi dan telah digunakan sehingga Kini, apabila pengecualian dikesan semasa program sedang berjalan dan program keluar secara tidak normal, sistem menyimpan status memori semasa program dalam fail teras, dipanggil teras dibuang, iaitu, pembuangan maklumat sistem pengendalian mengesan arus Apabila proses tidak normal, proses sasaran akan dimaklumkan tentang maklumat ralat yang sepadan melalui isyarat Isyarat biasa termasuk SIGSEGV, SIGBUS, dll. Secara lalai, proses akan mempunyai mekanisme pemprosesan yang sepadan untuk menerima isyarat yang sepadan.
Mengambil Linux sebagai contoh, Tindakan sepadan dengan kaedah pemprosesan isyarat Kotak merah ditandakan dengan isyarat biasa
Sebaik-baiknya. memahaminya sebelum melakukan ini Seterusnya, susun atur memori proses Susun atur ruang proses sistem Unix dan Linux akan menjadi lebih kecil daripada Linux, terutamanya proses kernel dan pengguna menggunakan mod ruang alamat yang berasingan ialah Linux sebagai contoh:
Lokasi storan fail coredump
Kita tahu bahawa dalam sistem Linux , jika proses ranap, kernel sistem akan menangkap maklumat ranap proses , dan kemudian menulis maklumat coredump proses ke fail Nama fail lalai kepada teras. Lokasi storan berada dalam direktori yang sama dengan program boleh laku yang sepadan Nama fail adalah teras Anda boleh melihat lokasi fail teras melalui arahan berikut:
Format Core_pattern:
%p PID proses dump
%u (nombor) UID sebenar proses dump
%G (nombor) dump The GID sebenar proses
%s Bilangan isyarat yang menyebabkan pembuangan
%t Masa pembuangan, dinyatakan sebagai bilangan saat sejak 1 Januari 1970 00:00:00 +0000 (UTC)
%H Nama hos (sama seperti nama nod yang dikembalikan oleh uname(2))
%e Nama fail boleh laku (tiada awalan laluan)
%E Nama laluan fail boleh laku, dengan slash ('/') Digantikan dengan tanda seru ('!').
%C Had sumber lembut saiz fail teras untuk proses ranap (sejak Linux 2.6.24)
Atur cara berikut boleh digunakan untuk menunjukkan sintaks paip dalam /proc/sys/kernel/ penggunaan fail core_pattern.
#include <sys/stat.h>
#include <fcntl.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define BUF_SIZE 1024
int main(int argc, char *argv[])
{
int tot, j;
ssize_t nread;
char buf[BUF_SIZE];
FILE *fp;
char cwd[PATH_MAX];
/* 属性的当前工作目录崩溃的过程*/
snprintf(cwd, PATH_MAX, "/proc/%s/cwd", argv[1]);
chdir(cwd);
/* 将输出写到该目录下的文件"core.info" */
fp = fopen("core.info", "w+");
if (fp == NULL)
{
exit(EXIT_FAILURE);
}
fprintf(fp, "argc=%d\n", argc);
for (j = 0; j < argc; j++)
{
fprintf(fp, "argc[%d]=<%s>\n", j, argv[j]);
}
/* 计算标准输入(核心转储)中的字节数*/
tot = 0;
while ((nread = read(STDIN_FILENO, buf, BUF_SIZE)) > 0)
{
tot += nread;
}
fprintf(fp, "Total bytes in core dump: %d\n", tot);
return 0;
}
注意一下: 这里是指在进程当前工作目录的下创建。通常与程序在相同的路径下。但如果程序中调用了chdir函数,则有可能改变了当前工作目录。这时core文件创建在chdir指定的路径下。有好多程序崩溃了,我们却找不到core文件放在什么位置。和chdir函数就有关系。当然程序崩溃了不一定都产生 core文件。
下面通过的命令可以更改coredump文件的存储位置,如下:
echo “|$PWD/core_pattern_pipe_test %p UID=%u GID=%g sig=%s” > /proc/sys/kernel/core_pattern
cat /proc/sys/kernel/core_pattern
查看路径已经变为如下:
下面带大家配置永久的core。只要出现内存访问越界、使用空指针、堆栈溢出等情况,都可以在这个目录下查看。
配置 core
1、首先在根目录下建立一个储存coredump文件的文件夹,命令如下:
mkdir /corefile
2、设置产生coredump文件的大小,命令如下:
ulimit -c unlimited
3、 执行以下两条命令:
echo “1” > /proc/sys/kernel/core_uses_pid //将1写入到该文件里 echo “/corefile/core-%e-%p-%t” > /proc/sys/kernel/core_pattern
将coredump产生的格式制定好写入core_pattern文件,这样当coredump产生时会直接以这种格式存入到根目录下的文件夹corefile中。
4、修改配置文件/etc/profile
vim /etc/profile
添加 ulimit -S -c unlimited > /dev/null 2>&1
执行命令生效该文件
5、 在配置文件/etc/rc.local中最后面添加信息(机器重启时会自动加载该命令):添加命令:
rm -rf /corefile/*
机器重启时清空该文件夹,由于产生的coredump文件很大,若不清空的话时间长了会将硬盘占满;
再执行以下两条命令:
echo “1” > /proc/sys/kernel/core_uses_pid echo “/corefile/core-%e-%p-%t” > /proc/sys/kernel/core_pattern
测试
下面写个例子测试一下是否配置好了corefile文件
#include
编译运行,注意这里需要-g选项编译。
进入前面创建的corefile文件夹:
出现core文件表示完成coredump配置。可以用通过readelf命令进行判断是否是core文件:
Jalankan gdb untuk membaca fail teras Perintahnya ialah "program gdb sepadan dengan fail coredump Pada masa ini, anda akan memasukkan gesaan gdb "(gdb)".
Seperti yang anda boleh lihat daripada tangkapan skrin kotak merah, program ditamatkan kerana isyarat 11.
Anda boleh melihat timbunan panggilan fungsi melalui perintah bt (jejak belakang) (atau di mana):
Iaitu, segfault berlaku apabila program dilaksanakan ke baris 6 test.cpp. Sebabnya ialah ia menunjuk kepada penunjuk nol.
Ringkasan
Terdapat banyak sebab untuk coredump program Berikut ialah ringkasan, terutamanya akses memori di luar had, penggunaan thread-unsafe fungsi, Menggunakan penunjuk nol, limpahan tindanan, dsb.
Saya ingin katakan di sini bahawa apabila menyahpepijat coredump dengan gdb, kebanyakan masa anda hanya boleh mengetahui sebab intuitif untuk teras daripada fail teras, tetapi sebab yang lebih asas biasanya perlu digabungkan dengan kod untuk menganalisis perjalanan proses pada masa itu Hanya melalui senario kontekstual kita boleh membuat kesimpulan di mana masalah terletak pada kod program.
Cadangan berkaitan: "Tutorial Video Linux"
Atas ialah kandungan terperinci Apakah maksud teras linux?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!