Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
898
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
951
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
941
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1726
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6087
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4399
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Как создать дамп ядра в Linux при ошибке сегментации?
У меня есть процесс в Linux, который получает ошибку сегментации. Как я могу сказать ему, чтобы он генерировал дамп ядра, когда он выходит из строя?
Это зависит от того, какой shell вы используете. Если вы используете bash, то команда ulimit управляет несколькими настройками, связанными с выполнением программы,например, следует ли сбрасывать ядро. Если вы набираете
ulimit -c unlimited
тогда это скажет bash, что его программы могут сбрасывать ядра любого размера. Вы можете указать такой размер, как 52M вместо неограниченного, если хотите, но на практике это не должно быть необходимо, так как размер основных файлов, вероятно, никогда не будет проблемой для вас.
В tcsh вы бы набрали
limit coredumpsize unlimited
Как было объяснено выше, реальный вопрос, который здесь задается, заключается в том, как включить основные дампы в системе, где они не включены. На этот вопрос уже отвечал здесь.
Если вы пришли сюда в надежде узнать, как создать дамп ядра для зависшего процесса, ответ таков:
gcore <pid>
если gcore недоступен в вашей системе, то
kill -ABRT <pid>
Не используйте kill -SEGV, так как это часто вызывает обработчик сигнала, что затрудняет диагностику застрявшего процесса
Чтобы проверить, где генерируются основные дампы, выполните команду:
sysctl kernel.core_pattern
или:
cat /proc/sys/kernel/core_pattern
где %e -имя процесса, а %t -системное время. Вы можете изменить его в /etc/sysctl.conf и перезагрузить на sysctl -p .
Если основные файлы не генерируются (проверьте их по формулам: sleep 10 & и killall -SIGSEGV sleep), проверьте ограничения по формулам: ulimit -a .
Если размер вашего основного файла ограничен, запустите:
ulimit -c unlimited
чтобы сделать его неограниченным.
Затем проверьте еще раз, если сброс ядра будет успешным, вы увидите “(Сброс ядра)” после индикации ошибки сегментации, как показано ниже:
Ошибка сегментации: 11 (ядро сброшено)
Смотрите также: ядро сброшено-но основной файл не находится в текущем каталоге?
Ubuntu
В Ubuntu основные дампы обрабатываются Apport и могут быть расположены в /var/crash/ . Однако в стабильных выпусках он по умолчанию отключен.
Для получения более подробной информации, пожалуйста, проверьте: где я могу найти дамп ядра в Ubuntu? .
macOS
Для macOS см.: Как создать дампы ядра в Mac OS X?
Возможно, вы могли бы сделать это таким образом, эта программа является демонстрацией того, как поймать ошибку сегментации и передать ее отладчику (это исходный код, используемый в разделе AIX ) и распечатать стек trace до точки ошибки сегментации. Вам нужно будет изменить переменную sprintf , чтобы использовать gdb в случае Linux.
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <stdarg.h>
static void signal_handler(int);
static void dumpstack(void);
static void cleanup(void);
void init_signals(void);
void panic(const char *, ...);
struct sigaction sigact;
char *progname;
int main(int argc, char **argv) {
char *s;
progname = *(argv);
atexit(cleanup);
init_signals();
printf("About to seg fault by assigning zero to *s\n");
*s = 0;
sigemptyset(&sigact.sa_mask);
return 0;
}
void init_signals(void) {
sigact.sa_handler = signal_handler;
sigemptyset(&sigact.sa_mask);
sigact.sa_flags = 0;
sigaction(SIGINT, &sigact, (struct sigaction *)NULL);
sigaddset(&sigact.sa_mask, SIGSEGV);
sigaction(SIGSEGV, &sigact, (struct sigaction *)NULL);
sigaddset(&sigact.sa_mask, SIGBUS);
sigaction(SIGBUS, &sigact, (struct sigaction *)NULL);
sigaddset(&sigact.sa_mask, SIGQUIT);
sigaction(SIGQUIT, &sigact, (struct sigaction *)NULL);
sigaddset(&sigact.sa_mask, SIGHUP);
sigaction(SIGHUP, &sigact, (struct sigaction *)NULL);
sigaddset(&sigact.sa_mask, SIGKILL);
sigaction(SIGKILL, &sigact, (struct sigaction *)NULL);
}
static void signal_handler(int sig) {
if (sig == SIGHUP) panic("FATAL: Program hanged up\n");
if (sig == SIGSEGV || sig == SIGBUS){
dumpstack();
panic("FATAL: %s Fault. Logged StackTrace\n", (sig == SIGSEGV) ? "Segmentation" : ((sig == SIGBUS) ? "Bus" : "Unknown"));
}
if (sig == SIGQUIT) panic("QUIT signal ended program\n");
if (sig == SIGKILL) panic("KILL signal ended program\n");
if (sig == SIGINT) ;
}
void panic(const char *fmt, ...) {
char buf[50];
va_list argptr;
va_start(argptr, fmt);
vsprintf(buf, fmt, argptr);
va_end(argptr);
fprintf(stderr, buf);
exit(-1);
}
static void dumpstack(void) {
/* Got this routine from http://www.whitefang.com/unix/faq_toc.html
** Section 6.5. Modified to redirect to file to prevent clutter
*/
/* This needs to be changed... */
char dbx[160];
sprintf(dbx, "echo 'where\ndetach' | dbx -a %d > %s.dump", getpid(), progname);
/* Change the dbx to gdb */
system(dbx);
return;
}
void cleanup(void) {
sigemptyset(&sigact.sa_mask);
/* Do any cleaning up chores here */
}
Возможно, вам придется дополнительно добавить параметр, чтобы получить gdb для сброса ядра, как показано здесь в этом блоге .
Есть еще много вещей, которые могут повлиять на генерацию дампа ядра. Я столкнулся с этим:
- каталог для дампа должен быть доступен для записи. По умолчанию это текущий каталог процесса, но его можно изменить, установив значение
/proc/sys/kernel/core_pattern. - в некоторых условиях значение kernel в
/proc/sys/fs/suid_dumpableможет препятствовать созданию ядра.
Есть и другие ситуации, которые могут предотвратить генерацию, описанные в справочной странице-попробуйте man core .
Для активации дампа ядра выполните следующие действия:
В
/etc/profileкомментарий строки:# ulimit -S -c 0 > /dev/null 2>&1В
/etc/security/limits.confзакомментируйте строку:* soft core 0выполните cmd
limit coredumpsize unlimitedи проверьте его с помощью cmdlimit:# limit coredumpsize unlimited # limit cputime unlimited filesize unlimited datasize unlimited stacksize 10240 kbytes coredumpsize unlimited memoryuse unlimited vmemoryuse unlimited descriptors 1024 memorylocked 32 kbytes maxproc 528383 #чтобы проверить, будет ли записан основной файл, вы можете убить связанный процесс с помощью cmd
kill -s SEGV <PID>(не нужно, просто в случае, если не будет записан основной файл, это можно использовать в качестве проверки):# kill -s SEGV <PID>
После того, как corefile был записан, убедитесь, что вы снова отключили настройки coredump в соответствующих файлах (1./2./3.) !
Для Ubuntu 14.04
Проверить дамп памяти включен:
ulimit -aОдна из линий должна быть :
core file size (blocks, -c) unlimitedЕсли нет :
gedit ~/.bashrcи добавитьulimit -c unlimitedв конец файла и сохранить, повторно запустить terminal.Построение приложения с использованием отладочной информации :
В Файле Makefile
-O0 -gЗапустите приложение, создающее дамп ядра (файл дампа ядра с именем ' core’ должен быть создан рядом с файлом application_name):
./application_nameРаботать под gdb:
gdb application_name core
Стоит отметить, что если у вас есть настроенная systemd , то все немного по-другому. Настройка, как правило, имеют основные файлы могут передавать посредством core_pattern значения переменной sysctl, через systemd-coredump(8) . Основной размер файла rlimit обычно уже настроен как "unlimited".
Затем можно получить основные дампы, используя coredumpctl(1) .
Хранение дампов и т. д. настроен на coredump.conf(5) . Есть примеры того, как получить основные файлы на man-странице coredumpctl, но вкратце это будет выглядеть так:
Найти основной файл:
[vps@phoenix]~$ coredumpctl list test_me | tail -1
Sun 2019-01-20 11:17:33 CET 16163 1224 1224 11 present /home/vps/test_me
Получить основной файл:
[vps@phoenix]~$ coredumpctl -o test_me.core dump 16163