Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
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
Получение трассировок стека в системах Unix, автоматически
Какие существуют методы автоматического получения стека trace в системах Unix? Я имею в виду не просто получение основного файла или Интерактивное подключение с помощью GDB, а наличие обработчика SIGSEGV, который сбрасывает обратную трассировку в текстовый файл.
Бонусные баллы за следующие дополнительные функции:
- Сбор дополнительной информации во время аварии (например. конфигурационный файл).
- Email информация о сбое bundle для разработчиков.
- Возможность добавить это в общую библиотеку
dlopened - Не требуется GUI
К ВАШЕМУ СВЕДЕНИЮ,
предложенное решение (использование backtrace_symbols в обработчике сигналов) опасно нарушено. НЕ ИСПОЛЬЗУЙТЕ ЕГО -
Да, backtrace и backtrace_symbols будут создавать backtrace и переводить его в символьные имена, однако:
backtrace_symbols выделяет память, используя malloc, и вы используете free, чтобы освободить ее - если вы терпите крах из-за повреждения памяти, ваша malloc Арена, скорее всего, будет повреждена и вызовет двойную ошибку.
malloc и свободно защищают арену malloc с внутренним замком. Возможно, вы ошиблись в середине malloc / free с блокировкой, которая приведет к тому, что эти функции или все, что их вызывает, будут заблокированы.
Вы используете puts, который использует стандартный поток, который также защищен блокировкой. Если вы ошиблись в середине printf, вы снова окажетесь в тупике.
На 32-битных платформах (например ваш обычный PC 2 года назад), то kernel будет помещать обратный адрес к внутренней функции glibc вместо вашей функции сбоя в вашем стеке, так что единственная наиболее важная часть информации, которая вас интересует - в какой функции произошла ошибка программы, На самом деле будет повреждена на этой платформе.
Таким образом, код в этом примере является наихудшим видом ошибки-он LOOKS как будто работает, но он действительно будет подводить вас неожиданными способами в производстве.
BTW, заинтересованы в том, чтобы сделать это правильно? проверить это.
Овации, Гилад.
Если вы находитесь на системах с доступной функциональностью BSD backtrace (Linux, OSX 1.5, BSD, конечно), вы можете сделать это программно в своем обработчике сигналов.
Например (код backtrace , полученный из примера IBM ):
#include <execinfo.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
void sig_handler(int sig)
{
void * array[25];
int nSize = backtrace(array, 25);
char ** symbols = backtrace_symbols(array, nSize);
for (int i = 0; i < nSize; i++)
{
puts(symbols[i]);;
}
free(symbols);
signal(sig, &sig_handler);
}
void h()
{
kill(0, SIGSEGV);
}
void g()
{
h();
}
void f()
{
g();
}
int main(int argc, char ** argv)
{
signal(SIGSEGV, &sig_handler);
f();
}
Выход:
0 a.out 0x00001f2d sig_handler + 35
1 libSystem.B.dylib 0x95f8f09b _sigtramp + 43
2 ??? 0xffffffff 0x0 + 4294967295
3 a.out 0x00001fb1 h + 26
4 a.out 0x00001fbe g + 11
5 a.out 0x00001fcb f + 11
6 a.out 0x00001ff5 main + 40
7 a.out 0x00001ede start + 54
Это не дает бонусных баллов за дополнительные функции (за исключением того, что не требует GUI), однако у него есть преимущество в том, что он очень прост и не требует никаких дополнительных библиотек или программ.
Вот пример того, как получить дополнительную информацию с помощью деманглера. Как вы можете видеть, этот также записывает stacktrace в файл.
#include <iostream>
#include <sstream>
#include <string>
#include <fstream>
#include <cxxabi.h>
void sig_handler(int sig)
{
std::stringstream stream;
void * array[25];
int nSize = backtrace(array, 25);
char ** symbols = backtrace_symbols(array, nSize);
for (unsigned int i = 0; i < size; i++) {
int status;
char *realname;
std::string current = symbols[i];
size_t start = current.find("(");
size_t end = current.find("+");
realname = NULL;
if (start != std::string::npos && end != std::string::npos) {
std::string symbol = current.substr(start+1, end-start-1);
realname = abi::__cxa_demangle(symbol.c_str(), 0, 0, &status);
}
if (realname != NULL)
stream << realname << std::endl;
else
stream << symbols[i] << std::endl;
free(realname);
}
free(symbols);
std::cerr << stream.str();
std::ofstream file("/tmp/error.log");
if (file.is_open()) {
if (file.good())
file << stream.str();
file.close();
}
signal(sig, &sig_handler);
}
Решение Dereks, вероятно, самое лучшее, но вот альтернатива в любом случае:
Последние версии Linux kernel позволяют передавать дампы ядра в сценарий или программу. Вы можете написать сценарий, чтобы поймать дамп ядра, собрать любую дополнительную информацию, которая вам нужна,и отправить все обратно. Однако это глобальная настройка, поэтому она будет применяться к любой аварийной программе в системе. Для его настройки Также потребуются права суперпользователя. Его можно настроить через файл /proc/sys/kernel/core_pattern. Установите это на что-то вроде '| /home/myuser/bin/my-core-handler-script'.
Ubuntu человек также используют эту функцию.