4

I have a algorithm which "sometimes" did not break the recursion and ends up in a stack overflow. Now I want to debug that situation. gdb points me directly to the line where I overwrite the stack boarder, but it is impossible to get a stacktrace because gdb needs endless time to unwind the stack and display it in ddd.

I now simply want to reduce the stack size to get the corruption much earlier. So I need a way to reduce to stack for my running task. There are no threads involved so it should be not such a big deal.

But I have no idea if gdb itself has an option to manipulte the stack (size) itself or I need to programmatic change the size at start of my prog or I can maybe reduce the size from the os command line ( linux ) after starting the debug session.

Maybe it is also possible the stop if the call tree reaches a maximum depth if gdb has such an option.

Klaus
  • 24,205
  • 7
  • 58
  • 113

1 Answers1

5

Try to use ulimit -s (stack_size) in shell where you run your program or you can do it programmatically Change stack size for a C++ application in Linux during compilation with GNU compiler

EDIT:

We can write simple nohup-like program, which send SIGSTOP to itself, and than execute it's arguments. Let's name it runpaused

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

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

Than, we can do next things: compile runpaused

$ gcc runpaused.c -o runpaused

limit stack for current shell

$ ulimit -s 32

run our program via runpaused, use sh as example

$ ./runpaused sh -c "echo Hello"

From other terminal: find it's PID

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

load gdb with our program

$ gdb $(which sh)

attach to PID

(gdb) attach PID

send signal SIGCONT from gdb

(gdb) signal SIGCONT

continue program execution from gdb

(gdb) continue

After several times of continuing, we get what we want.

Community
  • 1
  • 1
user2807083
  • 2,962
  • 4
  • 29
  • 37
  • using ulimit -s can not help, because this effects the debug session and not only the program which should be debugged. Is there a chance to set ulimit -s from gdb? But your link to the programmatically reduction of stacksize fits my problem. Maybe you can change your answer for other users. – Klaus Feb 20 '16 at 13:29
  • 3
    To set the ulimit only in the target, try `(gdb) set exec-wrapper sh -c 'ulimit -s 32;exec "$0" "$@"'` . More about the semantics of `exec-wrapper` [here](http://stackoverflow.com/a/27510210/2554472). – Mark Plotnick Feb 21 '16 at 04:26