Расширение Python GDB: я пытаюсь получить вызывающую строку и информацию о файле для вызова макроса, но получаю неправильные значения из-за комментариев

У меня есть следующий код С++:

основной.cpp:

#include "a.h"
int main(){

    int x[3];
    some_macro(x)
    // comment
    // comment
    return x[2];
}

ааа:

template <typename T>
inline void some_macro_break_point()
{
}

#define some_macro(name)                                         \
{                                                                \
    some_macro_break_point();                     \
}

и используя расширение Python GDB, я пытаюсь получить строку и файл, в которых был вызван макрос при использовании GDB, учитывая тот факт, что у меня есть автоматическая точка останова над some_macro_break_point

При достижении точки останова я делаю следующее:

frame = gdb.newest_frame()
frame = frame.older()
pc = frame.pc()
symtab_line = gdb.find_pc_line(pc)
print(">>>> ", symtab_line.symtab.fullname() + ":" + str(symtab_line.line), "<<<<\n") 

В случае, если у меня есть комментарии под вызовом макроса в основном файле, я получу строку + <number_of_comments_under_it>

Как я могу определить точную строку, в которой макрос был вызван правильно? Когда у меня нет комментариев, я получаю строку со смещением 1.

Я пытался получить символическую таблицу кадра GDB, но на значения повлиял тот факт, что под вызовом макроса были комментарии.

some_macro_break_point звонит себе? В любом случае код в a.h не компилируется.
ssbssa 24.06.2024 18:57

Попробуйте вычесть 1 из ПК, например pc = frame.pc() - 1.

ssbssa 24.06.2024 19:01

@ssbssa, я только что обновил, это была ошибка

Ruba Rushrush 24.06.2024 21:50

вычитание 1 из ПК сработало! но какая здесь логика?

Ruba Rushrush 24.06.2024 21:54

Неясно. Опубликуйте минимально воспроизводимый пример .

relent95 25.06.2024 03:21
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

ssbssa> Попробуйте вычесть 1 из ПК, например pc =frame.pc() - 1. Руба Рашраш> вычитание 1 от пк сработало! но какая здесь логика?

Логика такова: когда срабатывает ваша точка останова, кадр в стеке равен some_macro_break_point, а frame.older().pc() указывает на место в main, куда some_macro_break_point() вернется.

Это место находится после места, из которого main был вызван some_macro_break_point(), а именно, это следующая исполняемая строка.

Все это станет понятнее, если вы disas/s main и распечатаете frame.older().pc().

Другие вопросы по теме

Похожие вопросы

Аутентификация ManagedIdentityCredential недоступна. Запрошенный идентификатор не был назначен этому ресурсу
Использование REST API в Python для запуска рабочих процессов в Azure Purview
Как исправить столбец с числовыми значениями, который воспринимается как строковое поле из-за пустых строк в фрейме данных Pandas?
Как оценить цвет изображения Pyplot в данной точке?
Возможно ли иметь встроенное определение класса данных в Python?
Добавьте значения двух Dataframe на основе похожих значений строк
С помощью Python извлеките в файл Excel значение ячейки в строке, где ячейка в той же строке содержит строку символов из XML-файла
Обмен датой начала, датой окончания и другими столбцами с более ранней строкой, если даты больше 8 в фрейме данных pandas
Почему мой столбец row_number в PySpark испорчен при применении схемы?
Сравнение текста сообщения с результатом функции gettext в обработчике сообщений Aiogram