После установки точки останова в Qt, GDB говорит: «Ошибка доступа к адресу памяти» - PullRequest
5 голосов
/ 27 мая 2009

Я написал очень простую программу на Qt:

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);

    QTableView table(&frame);
    table.resize(100, 100);
    table.show();

    return app.exec();
}

И когда я пытаюсь установить точку останова, по которой нажимается таблица, я получаю эту ошибку от gdb:

(gdb) symbol-file /usr/lib/libQtGui.so.4.4.3.debug 
Load new symbol table from "/usr/lib/libQtGui.so.4.4.3.debug"? (y or n) y
Reading symbols from /usr/lib/libQtGui.so.4.4.3.debug...done.
(gdb) br 'QAbstractItemView::clicked(QModelIndex const&)'
Breakpoint 1 at 0x5fc660: file .moc/release-shared/moc_qabstractitemview.cpp, line 313.
(gdb) run
Starting program: ./qt-test
Warning:
Cannot insert breakpoint 1.
Error accessing memory address 0x5fc660: Input/output error.

Кто-нибудь знает, почему нельзя установить точку останова?

Ответы [ 4 ]

11 голосов
/ 27 мая 2009

Не используйте команду gdb symbol-file для загрузки внешних символов. Адреса точек останова будут неправильными, поскольку они не перемещены.

Вместо этого установите точку останова в main, запустите программу и затем установите точку останова:

gdb ./program
GNU gdb 6.8-debian blah blah blah
(gdb) br main
Breakpoint 1 at 0x80489c1
(gdb) run
Starting program: ./program
Breakpoint 1, 0x080489c1 in main ()
(gdb) br 'QAbstractItemView::clicked(QModelIndex const&)'
Breakpoint 2 at 0xb7d24664
(gdb) continue
Continuing.

Тогда заставь свою точку останова произойти.

Обязательно укажите список параметров в функции, в которой вы хотите установить точку останова, без имен этих параметров, только их типы.

4 голосов
/ 09 сентября 2010

Фактическая ошибка:

Ошибка доступа к адресу памяти 0x5fc660: Ошибка ввода / вывода.

Может быть вызвано 32/64 битными смешиваниями. Например, убедитесь, что вы не подключили 32-битный двоичный файл с идентификатором 64-битного процесса или наоборот.

2 голосов
/ 29 мая 2009

Если вы хотите автоматически подключиться к сети без установки точки останова, вы также можете использовать команду start.
Если вам нужно предоставить какие-либо аргументы программе, вы можете использовать:
start argument1 argument2

1 голос
/ 26 августа 2015

ОК, я понял это при сборке с помощью mingw-w64 (нативный или кросс-компилятор). Я не уверен, в чем именно заключалась проблема, но если я собираю его, используя gcc mingw-w64 i686-5.1.0-posix-sjlj-rt_v4-rev0, то он создает (наконец) отладочные сборки. В противном случае

(gdb) break main
...
(gdb) r
...
Cannot insert breakpoint 1.
Cannot access memory at address 0x42445c
<process basically hangs>

сообщение 19 раз из 20, хотя иногда оно действительно срабатывало (очень редко).

GDB 7.8.1 и 7.9.1, казалось, были в состоянии отладить созданный exe. Так что, вероятно, не версия GDB имеет значение.

Моя текущая теория / подозрение - это либо версия gcc, либо, возможно, «аспект» sljl vs. dwarf2 для компилятора [?] (I686-492-posix-dwarf-rt_v3-rev1 не работал, и кросс-компиляция с какой-то формой gcc 4.9.2 тоже не удалось). Не пробовал другие версии gcc.

обновление: более новый gcc (5.1.0), но кросс-компиляция Я все еще получал этот сбой. Причиной в этом случае оказалась библиотека зависимостей, которую использовала моя сборка (FFmpeg) путем ссылки на (в данном случае libgme), которая экспортирует несколько ошибочных «общих» символов (когда я собираю статический исполняемый файл). Из-за этого «общая» сборка тормоза (https://trac.ffmpeg.org/ticket/282) и каким-то образом также приводит к порче gdb. Например, возможное связывание с SDL может сделать это и для вас. Моя мысль, возможно, ошибка ld [? ]

...