I have a linux running on VMWare, and I use gdb in the host machine to attach to it when debugging. While running, my kernel will cause some of the processes hang, and I would like to investigate more.
What kernel gives me is the process id of the hung process along with a stack trace. However, without the arguments being passed, stack trace is not very useful. So I want to gather more information. So I have two questions:
-
Given the pid, how can I get the task_struct corresponds to the process? I tried to do ” p find_task_by_pid_ns(2533, &init_pid_ns) ” under gdb, however it hangs.
-
Once I got the task_struct and the stack pointer. My ultimate goal would be to reproduce the stack trace (with argument of each functioned called). Is there a tool to do that? Does gdb take a stack pointer and print the stack trace for me?
Thanks.
KDB will be helpful in this case. I don’t know which kernel version you are using, but if you are using kernel on or after linux-2.6.35, you can switch to the kdb from gdb using the following command:
Once you are in the kdb you can use ps command to get to know process descriptor address and can use bt command to trace a stack. Alternatively, you can run the kdb commands from the gdb using gdb ‘monitor’ command. For example, to use the ‘ps’ command of kdb, you can type the following command in your gdb.
You can get the list of kdb command using the following command.
Once you know the process descriptor, you can use the following documentation to trace any process’s stack.