LINUX.ORG.RU

GDB виснет вместе с отлаживаемой программой

 


0

2

Был проектик в Eclipse c Makefile и C-исходниками. Можно было нормально отлаживаться в исходниках с использованием gdb. Что добавил - clock_gettime, чтобы время исполнения померить.

В итоге, gdb останавливается на main, далее при попытке сделать step-over на первой же функции зависает в состоянии нитки «running : step». Ksysguard показывает висящий gdb, отжирающий 12% CPU и висящую задачу с 1%. Первая функция любая, в т.ч. «printf(«Hello!\n»)».

Просто запущенная из консоли прога отрабатывает OK.

Запустил gdb --tui test, b main, exec-file test, run (остановился на main), Шаг n. Все, дальше отладка не идет. В логе повторяется:

Breakpoint 1, main (argc=<error reading variable: Cannot access memory at address 0x7fffffffddbc>, argv=<error reading variable: Cannot access memory at address 0x7fffffffddb0>)
    at main.c:205
warning: Error removing breakpoint 1
Cannot remove breakpoints because program is no longer writable.
Further execution is probably impossible.

Ясно, что сегмент кода резко стал read-only. Но как, и как с этим отлаживаться?

UPD. Вот похожее гуглится. https://github.com/microsoft/vscode-cpptools/issues/11161

UPD2. Запустил sudo gdb ./test - отладка идет. Прога статически линкуется с исходниками libkcapi. Если их выкинуть из сборки - отладка работает. Раньше, еще месяц назад, запускал эту тестовую прогу под отладчиком без всяких sudo. Кто бы объяснил WTF происходит?



Последнее исправление: bugs-bunny (всего исправлений: 2)

Можно было нормально отлаживаться в исходниках с использованием gdb. Что добавил - clock_gettime, чтобы время исполнения померить.

и где этот добавленный код? или тема ради «посочуствуйте..» :-)

Ясно, что сегмент кода резко стал read-only. Но как, и как с этим отлаживаться?

а исправить добавленное никак ?

Вот похожее гуглится

вообще из другой оперы

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

Добавил. Как добавил так и закомментарил printf и clock_gettime.

#include <time.h>
.........
int main(int argc, char *argv[])
{
    struct timespec   t1s, t2s;

    printf("Hello world!\n");
    
    clock_gettime(CLOCK_THREAD_CPUTIME_ID, &t1s );
    .........
}

вообще из другой оперы

Что VSCode, что Eclipse - проблема не в том, кто дергает GDB, а в самом GDB. Запуск чистого GDB из консоли это показывает.

bugs-bunny
() автор топика

Гмгмгм… есть вот такое в интернетах:

Afaik this is expected if you use segment remapping. When you set a breakpoint the debugger modifies the memory mapping of the binary but the segment remapping code of libhugetlbfs unmaps the memory with the breakpoint (see elflink.c). Afaik, the only thing you can do is disabling ELF remapping when working under gdb. You can do that by adding "set environment HUGETLB_ELFMAP=no" in your gdbinit.

Посмотри через strace, libkcapi не делает странного с mmap()?

cumvillain
()

Всем спасибо. Для отладки поставил запуск gdb как sudo gdb, тогда все OK. Видимо, в коде есть функции, которые сметь хотеть может только root - открывать сокеты и устройства. Как это реализовано и зачем - хз.

bugs-bunny
() автор топика
Ответ на: комментарий от bugs-bunny

Видимо, в коде есть функции, которые сметь хотеть может только root - открывать сокеты и устройства.

Эти функции просто вернули бы тебе EPERM. Тут что-то поинтереснее :D

cumvillain
()