Могу ли я получить текущий предел sbrk () в GDB? - PullRequest
1 голос
/ 25 марта 2019

Я хотел бы знать, каков текущий предел sbrk() для отладки SEGV, с которым мне трудно. Мой код выглядит хорошо и работает в большинстве случаев (только один случай из множества разрывов с SEGV.)

Я думаю, это может быть связано с тем фактом, что в этом случае мы используем многопоточное приложение, но я просто не могу точно определить проблему сейчас. Я хотел бы сравнить адрес SEGV с пределом sbrk(), чтобы увидеть, насколько отключен адрес. Я думаю, это может быть mmap() или подобный адрес, который удаляется у меня под ногами.

1 Ответ

2 голосов
/ 25 марта 2019

Если процесс все еще имеет действительный стек, вы можете вызвать функцию sbrk из libc:

(gdb) print ((void *(*) (unsigned long)) sbrk)(0)
$1 = (void *) 0x55555580e000

Приведение не требуется, если GDB смог загрузить отладочную информацию для libc.

(Это может не работать для статически связанных двоичных файлов, если sbrk вообще не связан с программой.)

В принципе, это работает с любой функцией, для которой GDB может найти символ.Но безопасно ли вызывать конкретную функцию из GDB, зависит от того, где именно остановилась программа (например, вызов malloc изнутри malloc - это обычно плохая идея).

...