Разработчик отлаживает проблемы с помощью навигации по коду, трассировки путей вызовов, предложений точек останова и стратегий анализа по типам проблем на основе CPG.
Содержание¶
- Быстрый старт
- Как это работает
- Двухуровневая детекция интентов
- Двухфазная архитектура
- Зарегистрированные обработчики
- Функции CPG-поиска
- Доменно-независимая загрузка паттернов
- Методы анализа DebuggingHandler
- Предложение точек останова
- Анализ стека вызовов
- Трассировка потока переменных
- Генерация стратегии отладки
- Детекция типа проблемы
- Форматтеры отчётов
- Использование CLI
- Примеры вопросов
- Связанные сценарии
Быстрый старт¶
# Выберите сценарий отладки
/select 15
Как это работает¶
Двухуровневая детекция интентов¶
S15 использует двухуровневую систему детекции интентов. Базовый уровень выбирает, какую функцию CPG-поиска выполнить; уровень обработчиков выбирает шаблонный обработчик для структурированных отчётов.
Уровень 1 (базовый): detect_debug_intent() в debugging/intent.py классифицирует запросы в 8 интентов с помощью keyword_match_count_morphological() по паттернам из доменного плагина через get_debug_patterns_from_plugin():
| Интент | Описание |
|---|---|
logging |
Вызовы функций логирования и отчёта об ошибках |
assertion |
Макросы assert (Assert, static_assert) |
trace |
Функции трассировки и инструментирования |
explain |
Функции анализа планов запросов |
stack_trace |
Функции backtrace и дампа стека |
debug_output |
Макросы вывода отладочного уровня |
breakpoint |
Расположения точек останова |
generic |
Запасной вариант — общий поиск |
extract_error_level() также определяет конкретные уровни ошибок из запроса (ERROR, WARNING, INFO, LOG, DEBUG, TRACE, FATAL, CRITICAL), загружаемые из get_error_levels_from_plugin().
Уровень 2 (обработчики): DebuggingIntentDetector в debugging_handlers/intent_detector.py классифицирует запросы в 5 интентов обработчиков, отсортированных по приоритету:
| Интент | Приоритет | Описание |
|---|---|---|
breakpoint_suggestion |
10 | Предложения расположения точек останова |
call_stack |
20 | Анализ стека вызовов и путей выполнения |
variable_trace |
30 | Трассировка потока переменных через код |
debugging_strategy |
40 | Стратегии отладки по типам проблем |
general_debugging |
— | Запасной вариант (confidence=0.5) |
Детектор также извлекает:
- target_function — имя функции из запроса (7 regex-паттернов, включая русские: для palloc, функция palloc)
- issue_type — классификация проблемы: crash, hang, memory_leak, performance, logic_error
- topic — подсистема/категория из семантических маппингов доменного плагина
Двухфазная архитектура¶
S15 использует двухфазный подход:
Фаза 1: На основе обработчиков (без LLM). integrate_handlers() запускает DebuggingIntentDetector, проверяет уверенность по порогу cfg.thresholds.confidence_low, затем пробует 2 зарегистрированных обработчика. Если обработчик совпал и дал результаты, DebugReportFormatter форматирует структурированный отчёт без вызова LLM.
Фаза 2: Запасной вариант с LLM. Если ни один обработчик не совпал или уверенность слишком низкая, запускается полный конвейер: detect_debug_intent() выбирает одну из 8 функций поиска → CPG-запросы собирают отладочные конструкции → LLM генерирует анализ. Если LLM недоступен, generate_fallback_answer() создаёт структурированный ответ на основе секций доменного плагина.
Запрос -> DebuggingIntentDetector -> integrate_handlers()
| |
| Фаза 1: Обработчик совпал? Да -> DebugReportFormatter (без LLM)
| Нет -> Фаза 2: Полный конвейер
|
Фаза 2: detect_debug_intent() -> 8 функций поиска -> CPG-запросы
-> LLM с контекстом отладки -> Запасной ответ при недоступности LLM
Зарегистрированные обработчики¶
2 обработчика зарегистрированы в HandlerRegistry("debugging"):
| Обработчик | Приоритет | Интент |
|---|---|---|
BreakpointHandler |
10 | breakpoint_suggestion |
CallStackHandler |
20 | call_stack |
Оба наследуют DebuggingHandler (расширяет BaseHandler), который предоставляет 4 метода анализа, описанных ниже.
Функции CPG-поиска¶
Фаза 2 диспетчеризует одну из 8 функций поиска на основе обнаруженного базового интента. Каждая функция строит SQL-запросы к таблицам nodes_call / nodes_method:
| Функция | Интент | Описание |
|---|---|---|
find_logging_calls(cpg, query, error_level) |
logging |
Вызовы логирования и отчёта об ошибках, фильтруемые по уровню |
find_assertions(cpg, query) |
assertion |
Расположения макросов assert |
find_trace_points(cpg, query) |
trace |
Точки инструментирования трассировки |
find_explain_code(cpg, query) |
explain |
Функции анализа планов запросов |
find_stack_trace_functions(cpg, query) |
stack_trace |
Функции backtrace и дампа стека |
find_debug_output(cpg, query) |
debug_output |
Вызовы отладочного вывода |
find_breakpoint_functions(cpg, query) |
breakpoint |
Функции для точек останова с сопоставлением подсистем |
generic_debug_search(cpg, query) |
generic |
Запасной вариант — извлечение идентификаторов из запроса и поиск в CPG |
find_breakpoint_functions использует морфологическое сопоставление ключевых слов с паттернами подсистем из domain.get_breakpoint_subsystem_patterns() для выбора контекстно-специфичных SQL-запросов через build_breakpoint_query(subsystem, like_prefix).
generic_debug_search извлекает потенциальные имена функций через regex, фильтрует стоп-слова и ищет совпадения в nodes_method, возвращаясь к типичным отладочным паттернам при отсутствии результатов.
Доменно-независимая загрузка паттернов¶
Все отладочные паттерны загружаются из активного доменного плагина — никаких жёстко закодированных доменно-специфичных символов. get_debug_patterns_from_plugin() в debugging/patterns.py предоставляет 7 категорий с функциями и ключевыми словами:
| Метод плагина | Возвращает |
|---|---|
domain.get_all_debug_functions() |
Отладочные функции по категориям |
domain.get_breakpoint_functions(topic) |
Функции для точек останова |
domain.get_error_levels() |
Строки уровней ошибок |
domain.get_debug_query_patterns(query_type) |
Паттерны запросов по категориям |
domain.get_breakpoint_subsystem_patterns() |
Паттерны подсистем для выбора точек останова |
domain.get_debugging_keywords() |
Доменно-специфичные ключевые слова отладки |
domain.get_debugging_section_keywords() |
Ключевые слова секций для запасного ответа |
При отсутствии доменного плагина используются универсальные значения по умолчанию (printf, assert, trace и т.д.).
Методы анализа DebuggingHandler¶
DebuggingHandler(BaseHandler) в debugging_handlers/handlers/base.py предоставляет 4 метода анализа, используемых зарегистрированными обработчиками:
Предложение точек останова¶
_suggest_breakpoint_locations(target_function, issue_type, topic, limit=15) — предлагает расположения точек останова с уровнями приоритета:
- Если указана
target_function: добавляет саму функцию (высокий приоритет), её вызывающих (средний) и вызываемых (средний) из CPG - Загружает доменно-специфичные функции точек останова через
_get_breakpoint_functions_from_plugin(topic) - Каждое предложение содержит:
function,reason,priority(high/medium/low),type(entry_point/caller/callee/checkpoint/topic_function)
Анализ стека вызовов¶
_analyze_call_stack(start_function, depth=5) — анализирует цепочки вызовов от стартовой функции:
- Получает вызывающих (кто вызывает эту функцию) через
cpg.get_callers() - Получает вызываемых (что вызывает эта функция) через
cpg.get_callees() - Возвращает списки
callers_chainиcallees_chainс именами функций и путями файлов
Трассировка потока переменных¶
_trace_variable_flow(variable_name, function_name) — трассирует поток переменных через области видимости функций:
- Ищет функцию в CPG через
cpg.find_method_by_name() - Получает вызываемых для определения, куда могут распространяться значения переменных
- Возвращает точки потока с типом (
function_scope,potential_propagation), именем файла и номером строки
Генерация стратегии отладки¶
_generate_debugging_strategy(issue_type, target_function) — генерирует стратегии отладки по типам проблем:
| Тип проблемы | Рекомендуемые шаги | Инструменты |
|---|---|---|
crash |
Проверить null-указатели, выделение памяти, пути ошибок | gdb, valgrind, AddressSanitizer |
hang |
Проверить бесконечные циклы, паттерны блокировок, взаимоблокировки | gdb, strace, ThreadSanitizer |
memory_leak |
Найти выделения без освобождения, проверить ранние возвраты, очистку путей ошибок | valgrind, LeakSanitizer, massif |
| Общий | Пройти по выполнению, проверить переменные, трассировать стек | gdb, lldb |
Детекция типа проблемы¶
DebuggingIntentDetector._extract_issue_type() классифицирует тип проблемы из запроса с помощью морфологического сопоставления с EN+RU ключевыми словами:
| Тип проблемы | EN-ключевые слова | RU-ключевые слова |
|---|---|---|
crash |
crash, segfault, core dump | краш, падение, дамп |
hang |
hang, freeze, stuck, deadlock | зависание, заморозка, взаимоблокировка |
memory_leak |
memory leak, leak, memory growth | утечка памяти, утечка, рост памяти |
performance |
slow, performance, bottleneck | медленный, производительность, узкое место |
logic_error |
wrong result, incorrect, bug, error | неправильный, некорректный, ошибка, баг |
Обнаруженный тип проблемы влияет на предложения точек останова (какие функции приоритизировать) и стратегию отладки (какие инструменты и шаги рекомендовать).
Форматтеры отчётов¶
DebugReportFormatter(DebuggingFormatter) в debugging_handlers/formatters/debug_report.py предоставляет 2 формата отчётов:
format_breakpoint_report(report_data, language)— markdown-отчёт с целевой функцией, типом проблемы, разбивкой по приоритетам (количество high/medium/low), таблицей предложений (значок приоритета, функция, значок типа, причина) и 3 рекомендациямиformat_call_stack_report(report_data, language)— markdown-отчёт с целевой функцией, сводкой (количество вызывающих/вызываемых, глубина анализа), списком цепочки вызывающих, списком цепочки вызываемых и 3 рекомендациями
Базовый класс DebuggingFormatter предоставляет форматирование значков: format_priority_badge(priority, language) и format_breakpoint_type_badge(bp_type, language) для типов entry_point, caller, callee, checkpoint.
Использование CLI¶
# Поиск точек останова для функции
python -m src.cli query "Suggest breakpoints for debugging heap_insert"
# Анализ стека вызовов
python -m src.cli query "Show call stack for ExecProcNode"
# Поиск обработчиков ошибок
python -m src.cli query "Find error handlers in the executor module"
# Трассировка потока переменных
python -m src.cli query "Trace variable flow through palloc"
# Стратегия отладки для падения
python -m src.cli query "How to debug a crash in heap_insert"
# Поиск вызовов логирования
python -m src.cli query "Find all logging calls at ERROR level"
# Поиск макросов assert
python -m src.cli query "Find assertion macros in the storage subsystem"
Примеры вопросов¶
- «Предложить точки останова для отладки [функции]»
- «Показать стек вызовов для [функции]»
- «Найти обработчики ошибок в [модуле]»
- «Какие функции вызывает [функция]?»
- «Отследить поток переменных через [функцию]»
- «Как отладить падение в [функции]»
- «Найти все вызовы логирования уровня ERROR»
- «Найти макросы assert в [подсистеме]»
- «Отладить утечку памяти в [модуле]»
- «Показать стратегию отладки для проблем взаимоблокировки»
Связанные сценарии¶
- Производительность — Профилирование производительности и анализ узких мест (S06)
- Безопасность — Обнаружение уязвимостей безопасности (S02)
- Рефакторинг — Обнаружение запахов кода и мёртвого кода (S05)
- Ознакомление — Исследование и понимание кодовой базы (S01)
S15 vs S06 vs S02 vs S05: S15 фокусируется на интерактивной поддержке отладки — предложения точек останова, анализ стека вызовов, трассировка путей ошибок и стратегии отладки по типам проблем (crash, hang, memory leak). S06 фокусируется на профилировании производительности — обнаружение горячих точек, анализ узких мест и рекомендации по оптимизации. S02 фокусируется на безопасности — сканирование уязвимостей, анализ потоков данных и проверки соответствия. S05 фокусируется на качестве кода — обнаружение запахов, мёртвый код и планы рефакторинга. S15 разделяет CPG-запросы и анализ графа вызовов с этими сценариями, но применяет их конкретно к рабочим процессам отладки.