Как генерировать дамп ядра в Linux на отказе сегментации?

Я считаю, что большинство людей, приземлившихся здесь, используют ZSH thorugh iterm или что-то еще, и это приводит вас к этому ответу .

Вы должны добавить / изменить свои команды в ~/.zshrc.

207
задан kenorb 21 January 2019 в 03:00
поделиться

5 ответов

Это зависит, на какой оболочке Вы используете. Если Вы используете удар, то команда ulimit управляет несколькими настройками, касающимися выполнения программы, такой как, необходимо ли вывести ядро. Если Вы тип

ulimit -c unlimited

тогда, это скажет удару, что его программы могут вывести ядра любого размера. Можно определить размер такой как 52M вместо неограниченного, если Вы хотите, но на практике это не должно быть необходимо, так как размер базовых файлов, вероятно, никогда не будет проблемой для Вас.

В tcsh, Вы ввели бы

limit coredumpsize unlimited
236
ответ дан Eli Courtwright 23 November 2019 в 04:44
поделиться

По умолчанию Вы получите базовый файл. Проверьте, чтобы видеть, что текущий каталог процесса перезаписываем, или никакой базовый файл не будет создан.

4
ответ дан Mark Harrison 23 November 2019 в 04:44
поделиться

То, что я сделал в конце, было присоединением gdb к процессу, прежде чем это отказало, и затем когда это получило segfault, я выполнился эти generate-core-file команда. То принудительное поколение дампа ядра.

24
ответ дан Nathan Fellman 23 November 2019 в 04:44
поделиться

Ubuntu 19.04

Все другие ответы сами не помогли мне. Но продолжающая сумма сделала задание

, Создают ~/.config/apport/settings со следующим содержанием:

[main]
unpackaged=true

(Это говорит по левую сторону судна, чтобы также записать дампы ядра для пользовательских приложений)

проверка: ulimit -c. Если это производит 0, зафиксируйте его с [1 119]

ulimit -c unlimited

Только для в случае, если перезапуск по левую сторону судна:

sudo systemctl restart apport

файлы Катастрофического отказа теперь записаны в /var/crash/. Но Вы не можете использовать их с gdb. Для использования их с gdb используйте

apport-unpack <location_of_report> <target_directory>

Дополнительная информация:

  • Некоторые ответы предлагают измениться core_pattern. Знайте, тот, что файл мог бы быть перезаписан по левую сторону судна сервис на перезапуск.
  • Просто остановка по левую сторону судна не сделала задания
  • Эти ulimit -c, значение могло бы быть изменено автоматически при попытке других ответов сети. Обязательно проверьте его регулярно во время установки Вашего создания дампа ядра.

Ссылки:

0
ответ дан 23 November 2019 в 04:44
поделиться

Может быть, вы можете сделать это таким образом, эта программа представляет собой демонстрацию того, как поймать неисправность сегментации и оболочки до отладчика (это исходный код, используемый в AIX ) и печатает трассировку стека до точки ошибки сегментации. Вам нужно будет изменить переменную 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, чтобы выбросить ядро, как показано здесь, в этом блоге здесь .

19
ответ дан 23 November 2019 в 04:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: