MyTetra Share
Делитесь знаниями!
Как в Qt Creator 9.0.2 заставить отладчик показывать QString, QList и прочие Qt-объекты?
Время создания: 28.10.2025 11:04
Текстовые метки: linux, debian, qt, creator, qtcreator, gdb, отладчик, отладка, баг, исправить, показывать, отбражать, содержимое, значение, QString, QList, QMap, исправление
Раздел: Компьютер - Программирование - Язык C++ (Си++) - Библиотека Qt - Среда разработки QtCreator
Запись: xintrea/mytetra_syncro/master/base/176163865527b0hjuix9/text.html на raw.github.com

В операционной системе Debian Linux 12, как в прочем, и в любом другом Linux, обнаружено очередное несоответствие между частями системы. На этот раз среда разработки QtCreator 9.0.2 не подружилась со стандартным отладчиком GDB.



Выражается это в том, что в момент отладки невозможно посмотреть содержимое таких стандартных Qt-объектов как QString, QStringList, QList, QMap и прочих. Вместо значений отладчик показывает адреса объектов и их внутреннюю страктуру, по которой очень сложно понять, что же объект в себе содержит. Таким образом, отладка становится невозможной.



Как же решить данную проблему? Вот ссылка на багрепорт:



https://bugreports.qt.io/browse/QTCREATORBUG-28659



Из всего обсуждения выясняется следующее решение. Нужно создать файл патча our.patch следующего содержания:



diff -Naru ../debugger.orig/dumper.py ./dumper.py

--- ../debugger.orig/dumper.py 2023-01-21 17:13:47.447330804 +0100

+++ ./dumper.py 2023-01-21 16:36:03.205563034 +0100

@@ -2496,7 +2496,7 @@

try:

if funcname.startswith('qdump__'):

typename = funcname[7:]

- spec = inspect.getargspec(function)

+ spec = inspect.getfullargspec(function)

if len(spec.args) == 2:

self.qqDumpers[typename] = function

elif len(spec.args) == 3 and len(spec.defaults) == 1:

diff -Naru ../debugger.orig/gdbbridge.py ./gdbbridge.py

--- ../debugger.orig/gdbbridge.py 2023-01-21 17:12:23.156040571 +0100

+++ ./gdbbridge.py 2023-01-21 17:09:01.528744766 +0100

@@ -1506,9 +1506,10 @@

self.setupDumpers({})

def put(self, line):

- if self.output.endswith('\n'):

- self.output = self.output[0:-1]

- self.output += line

+ if self.output:

+ if self.output[-1].endswith('\n'):

+ self.output[-1] = self.output[-1][0:-1]

+ self.output.append(line)

def putNumChild(self, numchild):

pass



Далее надо найти файлы, к которым будет применен данный патч. В ОС Debian Linux 12 они находятся в каталоге:



/usr/share/qtcreator/debugger



Сами файлы имеют название:



dumper.py

gdbbridge.py



Надо под рутом перейти в вышеуказанный каталог с py-файлами, и выполнить команду:



patch -s -p0 < путь_где_лужит_patch_файл/our.patch



Если повезет, то оба файла будут пропатчены, и отладка начнет отображать содержимое Qt-объектов.



Но, скорее всего, не повезет, или повезет частично. Потому что неизвестно, к какой версии исходных файлов должен применяться файл патча. Сам файл патча расчитан на одно содержимое файла, а файл, к которому он применяется - имеет другое содержимое, потому что разработка не стоит на месте, что-то постоянно меняется. В любом случае, если патч не применится или применится не полностью, будет сообщение об ошибке.


В этом случае, надо редактировать py-файлы вручную. Несмотря на мешанину символов, в patch-файле видно, что он состоит из двух частей. Первая часть предназначена для файла dumper.py, вторая часть - для файла gdbbridge.py.


Для первого файла надо найти строку с номером 2496, которая должна выглядеть так, как написано в строчке, начинающейся на "-". И заменить ее на строку, которая начинается на "+". Сами -/+ в файл писать не нужно. Возможно, что эта строка будет не 2496, а где-то в ее окрестностях, ведь файл, возможно, менялся.


То же самое надо сделать и для второго файла: надо найти строку 1506, или ее окрестности, где будет начинаться блок из трех строк, в начале которых написаны "-". Его надо заменить на блок строк, где написаны "+".


Так как изменения вносятся в файлы на языке Python, то нужно аккуратно следить за отступами.



Если все сделано правильно, то при последующем перезапуске Qt Creator 9.0.2, в отладчике начнут быть видны значения Qt-объектов: строки, списки, словари и т. д.


 
MyTetra Share v.0.67
Яндекс индекс цитирования