|
|||||||
|
Как в 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.githubusercontent.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-объектов: строки, списки, словари и т. д. |
|||||||
|
Так же в этом разделе:
|
|||||||
|
|||||||
|
|||||||
|