Понимание выхода электрического забора и GDB
При отладке программы, которая заканчивается segfault, электрический забор, в сочетании с gdb, возвращает это:
"ElectricFence Exiting: mprotect() failed: Cannot allocate memory
[Thread 0xb0bd4b70 (LWP 5363) exited]
Program exited with code 0377.
Я действительно думал, что электрический забор будет более полезным. Что это значит? Как я могу интерпретировать эту информацию? Кажется, не осталось ни одного стека, на который я мог бы взглянуть, или, по крайней мере, bt
не вернет ничего.
Любое предложение будет действительно оценено.
Спасибо!
2 ответа
Вы, вероятно, исчерпали области карты памяти. Известно, что по умолчанию используется низкий уровень при использовании отладочных распределителей. Это можно настроить во время выполнения с помощью
echo 128000 > /proc/sys/vm/max_map_count
или добавив эту строку в /etc/sysctl.conf и перезагрузившись:
vm.max_map_count = 128000
Число max_map_count по умолчанию равно 65530 и может быть увеличено до MAX_INT при необходимости.
Для получения дополнительной информации см.:
Вывод ElectricFence просто означает, что ему не хватает памяти, и он не может вам помочь.
ElectricFence налагает чрезвычайно большие накладные расходы памяти, особенно для программ с большим количеством выделенной памяти.
Если вы используете Linux, попробуйте Valgrind.
Также обратите внимание, что ваш первый шаг для программы, которая умирает с SIGSEGV
не должен запускать его с ElectricFence; скорее вы должны запустить программу под отладчиком и посмотреть, где она падает.