LINUX.ORG.RU

segmentation fault, не дать убить программу


0

1

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

Жжошь, ты б еще спросил, как заставить приложение работать после того, как выдернул планку памяти.

fluorite ★★★★★
()
Ответ на: комментарий от fluorite

приложение пытается считать строку с непренадлежащей ему памяти, пусть она считает что угодно, это не важно

preepunk
() автор топика

Кстати, если получится запустить приложение любой ценой на выключенном компьютере - маякни, невпадлу.

Zhbert ★★★★★
()
Ответ на: комментарий от Zhbert

>Думаю, никак.

если я ничего не путаю то segmentation fault есть сигнал как KILL HUP итп а такие сигналы убить возможно, да и вообще о том что ты просишь не своей памяти сообщает операционка, те операционку надо отучить это делать )

preepunk
() автор топика

gdb, mcedit, as и ld тебя спасут

luke ★★★★★
()

запускай код с сегфолтом в отдельном процессе, как вылетит - прибивай и запускай новый

shty ★★★★★
()
Ответ на: комментарий от dyb4hzvo

>Запускай программу перед этим сделав

в консоли это написать? не получается. что это вообще, глобальная константа?

preepunk
() автор топика
Ответ на: комментарий от preepunk

Это переменная окружения. Я скрипт писал, который выставлял переменную и потом запускал программу. Тоже SIGSEGV был.

dyb4hzvo
()
Ответ на: комментарий от preepunk
#include <signal.h>
#include <stdio.h>

void my_signal_handler(int sig)
{
    write(STDERR_FILENO, "SEGFAULT!\n", 10); 
    signal(SIGSEGV, my_signal_handler); // reset the signal handler for SIGSEGV
    abort();
}

int main()
{
   signal(SIGSEGV, my_signal_handler); // initial set of signal handler
   /* do stuff here  */
   signal(SIGSEGV, SIG_DFL);  // restore default behavior

}

Но не делай так никогда

fluorite ★★★★★
()

пропатчи ядро

bk_ ★★
()

Код закрытый => нужен вызов exec() и создание дочернего процесса. В Linux часть сигналов дочернего процесса будет сброшено в SIG_DFL кроме некоторых, для которых в родительском процессе установлен SIG_IGN. К сожалению, для SIGSEGV нельзя установить SIG_IGN.
Вывод таков

backbone ★★★★★
()

Запустить под отладчиком?

lyset ★★★
()

Подсунь LD_PRELOAD'ом какую-нибудь функцию, которая подстелит твоей убогонькой проге соломки в том месте, где она падает.

const86 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.