Я хочу отладить ядро приложения C++ и файлы gcore.
Это включает в себя создание отчетов для соответствующих данных в репозиториях двоичных данных.
Эти репозитории основаны на STL контейнеры (std::map, std::set, std::vector, ...)
Для этого я использую свои собственные «универсальные» помощники Python для автоматического перемещения по STL контейнеры, вызывать функцию обратного вызова для обработки данных и создавать отчеты о данных.
cat $HOME/.gdbinit
set print object
set print pretty
set print static off
set pagination off
set auto-load safe-path /
python
sys.path.insert(0, "/home/me/TEST")
import main
end
set history filename ~/.gdb_history
set history save
Запустите демонстрацию в 'gdb', например. gcc 4.8.5
(gdb) PrintStaticData
Python Exception There is no member or method named _M_value_field.:
Error occurred in Python: There is no member or method named _M_value_field.
Поля _M_value_field больше нет, которое я использую здесь, в stdlhelper.py:
Поэтому я мог бы попытаться обновить код Python, чтобы он также обрабатывал новую реализацию STL.
Но я думаю (надеюсь), что в наборе инструментов gcc python STL уже есть какой-то универсальный инструмент, позволяющий сделать то же самое:
Обходите любой контейнер STL - без необходимости знать о его реализации - и вызывайте функцию обратного вызова для обработки каждого элемента, который хранится в контейнере.
Я хочу отладить ядро приложения C++ и файлы gcore.
Это включает в себя создание отчетов для соответствующих данных в репозиториях двоичных данных.
Эти репозитории основаны на STL контейнеры (std::map, std::set, std::vector, ...)
Для этого я использую свои собственные «универсальные» помощники Python для автоматического перемещения по STL контейнеры, вызывать функцию обратного вызова для обработки данных и создавать отчеты о данных.
Вот пример:
Тестовая программа на C++: [code]#include #include #include
int main(int, char**) { // set breakpoint here and inspect data return 0; } [/code] скомпилируйте его с помощью: [code]> g++ -std=c++11 -o main -g3 -O0 main.cpp [/code] используйте скрипты Python №2 для отладки: Файл №1: [code]> cat stlhelper.py # -*- coding: utf-8 -*-
import gdb import sys import re import itertools import six
# # base class for PrintGenricXY # class PrintGenericCommon (gdb.Function): """print generic common"""
def __init__ (self): super (PrintGenericCommon, self).__init__ ("PrintGenericList")
# # data is hosted by the subject and we don't know their representation # subject.ElemItemString() is responsible to format properly (might be complex data) # def PrintResult(self, subject): # calculate the max sizes per element of all lines for alignment sizes = subject.sizesDef for x in subject.result: for key, value in six.iteritems(sizes): valStr = subject.ElemItemString(x[key]) if len(valStr) > value: sizes[key] = len(valStr)
totalSize = 0 for key, value in six.iteritems(sizes): sizes[key] += 2 totalSize += sizes[key]
print("-" * totalSize) for i in range(len(subject.result)): myStr = '' for j in range(len(subject.elements)): setSize=sizes[subject.elements[j]] if (j == len(subject.elements) - 1): setSize=0 # don't auto-align the last element, which often can have some large elements in the list myStr += "%-*s" % (setSize, subject.ElemItemString(subject.result[i][subject.elements[j]])) print (myStr) # print optional __VERBOSE data in a next line if '__VERBOSE' in subject.result[i]: str = subject.ElemItemString(subject.result[i]['__VERBOSE']) lines = str.splitlines() for line in lines: print ('\t' + line) if len(str) > 0 and str[-1] == '\n': print('') if i == 0: print ("-" * totalSize)
# # generic printer for std::map and std::set # class PrintGenericMapOrSet (PrintGenericCommon): """print generic map/set"""
regex = re.compile('\$count')
maxNoResults = -1
def __init__ (self): super (PrintGenericCommon, self).__init__ ("PrintGenericMapOrSet")
def ReInit(self): if(platform.python_version().startswith("2")): for key, value in six.iteritems(self.headline): self.sizesDef[key] = 0 else: for key in self.headline.keys(): self.sizesDef[key] = 0 self.result = [] self.result.append(self.headline)
data = gdb.parse_and_eval("staticData") result = self.printer.invokeCore( [], data, '', self.Traverse)
self.printer.PrintResult(self)
PrintStaticData() [/code] Файл .gdbinit (настройте свои пути): [code]cat $HOME/.gdbinit set print object set print pretty set print static off set pagination off set auto-load safe-path /
python sys.path.insert(0, "/home/me/TEST") import main end
set history filename ~/.gdb_history set history save [/code] Запустите демонстрацию в 'gdb', например. gcc 4.8.5 [code]> gdb main (gdb) break 35 Breakpoint 1 at 0x400c18: file main.cpp, line 35.
(gdb) r Starting program: /home/me/TEST/main
Breakpoint 1, main () at main.cpp:35 35 return 0;
(gdb) PrintStaticData ---------------------------------------------- Key Value #1 Value #2 Value #3 ---------------------------------------------- 1 1 "hello" 3 2 10 "hi" 0.29999999999999999 3 50 "salute" 11.5 [/code] Пока все хорошо.
Проблема в том, что он больше не работает для gcc 9.4.0. :-(
Причина в том, что внутренняя структура данных для типа STL std::map изменилась.
Мои помощники Python на самом деле не являются «универсальными» — они зависят от конкретной реализации STL.
Используя gcc 9.4.0, я нажал [code](gdb) PrintStaticData Python Exception There is no member or method named _M_value_field.: Error occurred in Python: There is no member or method named _M_value_field. [/code] Поля _M_value_field больше нет, которое я использую здесь, в stdlhelper.py: [code] collectedLines.append(valueHandler(i, node.cast (nodetype).dereference()['_M_value_field'], node)) [/code] Поэтому я мог бы попытаться обновить код Python, чтобы он также обрабатывал новую реализацию STL.
Но я думаю (надеюсь), что в наборе инструментов gcc python STL уже есть какой-то универсальный инструмент, позволяющий сделать то же самое:
Обходите любой контейнер STL - без необходимости знать о его реализации - и вызывайте функцию обратного вызова для обработки каждого элемента, который хранится в контейнере.
При настройке URL-адреса обратного вызова веб-перехватчика возникает ошибка: «URL-адрес обратного вызова или токен проверки не удалось проверить. Проверьте предоставленную информацию или повторите попытку позже».
При настройке URL-адреса обратного вызова веб-перехватчика возникает ошибка: «URL обратного вызова или токен проверки не удалось проверить. Проверьте предоставленную информацию или повторите попытку позже».
При настройке URL-адреса обратного вызова веб-перехватчика возникает ошибка: «URL обратного вызова или токен проверки не удалось проверить. Проверьте предоставленную информацию или повторите попытку позже».
Я создал приложение в Твиттере и пытаюсь сделать базовую аутентификацию, но я получаю приведенную ниже ошибку, так что кто -нибудь может помочь мне в этом? Как разрешить ошибку? Утвержденные URL -адреса обратного вызова могут быть скорректированы в...
Существует ли A standard способ получить доступ к базовому контейнеру стека , queue , drivetory_queue ? Никто для приоритета Я думаю, что это все равно не стандартное.
Кроме того, я знаю, что это глупый вопрос! Где я могу найти официальную...