2016-02-20 1 views
2

У меня есть алгоритм, который «иногда» не прерывал рекурсию и заканчивался переполнением стека. Теперь я хочу отладить эту ситуацию. gdb указывает мне прямо на строку, где я перезаписываю вкладку стека, но невозможно получить stacktrace, потому что gdb требует бесконечного времени, чтобы развернуть стек и отобразить его в ddd.уменьшить размер стека в отладочной сессии, чтобы поймать бесконечную рекурсию

Теперь я просто хочу уменьшить размер стека, чтобы получить коррупцию намного раньше. Поэтому мне нужно, чтобы уменьшить стек до текущей задачи. В этом нет ни одного потока, поэтому это не должно быть большой проблемой.

Но я понятия не имею, имеет ли сам gdb возможность манипулировать стеком (размером) или мне нужно программно изменить размер в начале моей проги, или я могу уменьшить размер из командной строки os (linux) после запуска сеанса отладки.

Возможно, возможно также остановить остановку, если дерево вызовов достигнет максимальной глубины, если у gdb есть такая опция.

ответ

4

Попробуйте использовать ulimit -s (STACK_SIZE) в оболочке, где вы запускаете программу или вы можете сделать это программно Change stack size for a C++ application in Linux during compilation with GNU compiler

EDIT:

Мы можем написать простой поЬир-как программа, которая отправить SIGSTOP к себе, и выполнить его аргументы. Давайте назовем это runpaused

//runpaused.c 
#include <signal.h> 
#include <unistd.h> 

int main(int argc, char **argv) 
{ 
    raise(SIGSTOP); 
    return execvp(argv[1], argv+1); 
} 

Чем, мы можем сделать следующие вещи: компиляции runpaused

$ gcc runpaused.c -o runpaused 

предел стека для текущей оболочки

$ ulimit -s 32 

запустить нашу программу через runpaused, используйте ш как пример

$ ./runpaused sh -c "echo Hello" 

С другого терминала: найти это PID

$ ps -ef | grep -v grep | grep runpaused 

нагрузки GDB с нашей программой

$ gdb $(which sh) 

придают PID

(gdb) attach PID 

посыла сигнала SIGCONT из gdb

(gdb) signal SIGCONT 

продолжить выполнение программы с gdb

(gdb) continue 

После нескольких продолжается, мы получаем то, что мы хотим.

+0

Использование ulimit -s не может помочь, поскольку это влияет на сеанс отладки, а не только на программу, которая должна быть отлажена. Есть ли возможность установить ulimit -s из gdb? Но ваша связь с программным сокращением stacksize подходит для моей проблемы. Возможно, вы можете изменить свой ответ для других пользователей. – Klaus

+0

Я обновил свой ответ – user2807083

+1

Чтобы установить ulimit только в цель, попробуйте '(gdb) установить exec-wrapper sh -c 'ulimit -s 32; exec" $ 0 "" $ @ "''. Подробнее о семантике 'exec-wrapper' [здесь] (http://stackoverflow.com/a/27510210/2554472). –