Я исследую утечку памяти и посмотрел на /proc/<pid>/maps и текущие потоки:
# ps -T -p 11528
PID SPID TTY TIME CMD
11528 11528 ? 00:00:00 bin
11528 11529 ? 00:00:01 bin
11528 11532 ? 00:00:02 bin
11528 11533 ? 00:00:02 bin
11528 11534 ? 00:00:02 bin
11528 11535 ? 00:00:02 bin
11528 11536 ? 00:00:02 bin
11528 11537 ? 00:00:02 bin
11528 11538 ? 00:00:02 bin
11528 11539 ? 00:00:02 bin
11528 11540 ? 00:00:02 bin
11528 11541 ? 00:00:02 bin
Есть ли способ узнать, где начинается адрес стека некоторого потока? Например. у меня pid процесса 11528. Как получить адрес tid 11529, чтобы я мог сбросить стек с помощью gdb?
Вы можете прикрепить gdb к spidgdb -p <spid>, тогда используйте info frame или print $esp/$rsp, если это поможет.
@Ctx Я только что распечатал rsp потока 11529, print $rsp $1 = (void *) 0x7f7dad0f1bc0, и, поскольку 11529 является потомком 11528, я сделал grep 7f7dad0f1bc0 /proc/11528/maps и ничего не нашел. Содержащаяся в нем карта была похожа на следующую 7f7dacff6000-7f7dad0f5000. Почему? Я ожидал, что там будет верхушка стопки.
@SomeName: %rsp потока был уменьшен от вершины стека, потому что он использовал часть стека - вы можете сказать, что это правильный стек, потому что %rsp находится между начальным и конечным адресами отображения.





Вы можете переключить поток с помощью
thread 11529в gdb, а затем распечатать свой esp / rsp. См. Также sourceware.org/gdb/onlinedocs/gdb/Threads.html