/
disciplina
/
stepik-python-debugging
Обзор
Документация
Войти
/
disciplina
/
stepik-python-debugging
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
lessons/module1/1.3/lesson3.step
18 строк
9 KB
Sergey
Вторая версия курса
27 янв 2026, 21:14
27 янв 2026, 21:14
79b9655
Код
Авторство
О чём код?
{ "block": { "name": "text", "text": "<h2>Способы запуска pdb</h2>\n\n<p>Существует несколько методов запуска отладчика pdb в зависимости от ваших потребностей. Рассмотрим каждый из них подробно.</p>\n\n<h3>1. Использование <code>breakpoint()</code> (Рекомендуется, Python 3.7+)</h3>\n\n<p><strong>breakpoint()</strong> — это встроенная функция Python, которая является предпочтительным способом запуска отладчика.</p>\n\n<h4>Преимущества:</h4>\n<ul>\n<li>✅ Не требует импорта модуля pdb</li>\n<li>✅ Короткая и понятная</li>\n<li>✅ Можно настроить через переменную окружения <code>PYTHONBREAKPOINT</code></li>\n<li>✅ Легко отключить все breakpoint'ы установкой <code>PYTHONBREAKPOINT=0</code></li>\n</ul>\n\n<h4>Пример использования:</h4>\n<pre><code>def calculate_average(numbers):\n total = sum(numbers)\n count = len(numbers)\n breakpoint() # Программа остановится здесь\n average = total / count\n return average\n\nresult = calculate_average([10, 20, 30, 40])\nprint(f\"Среднее: {result}\")\n</code></pre>\n\n<p>При выполнении программа остановится на строке с <code>breakpoint()</code>:</p>\n<pre><code>> calculate_average()\n-> average = total / count\n(Pdb) _\n</code></pre>\n\n<h4>Настройка через переменную окружения:</h4>\n<pre><code># Использовать ipdb вместо pdb\nexport PYTHONBREAKPOINT=ipdb.set_trace\n\n# Отключить все breakpoint()\nexport PYTHONBREAKPOINT=0\n\n# Вернуть pdb по умолчанию\nunset PYTHONBREAKPOINT\n</code></pre>\n\n<h3>2. Использование <code>pdb.set_trace()</code></h3>\n\n<p>Более старый способ, который всё ещё широко используется, особенно в проектах с поддержкой Python < 3.7.</p>\n\n<h4>Пример:</h4>\n<pre><code>import pdb\n\ndef divide_numbers(a, b):\n pdb.set_trace() # Остановка для отладки\n result = a / b\n return result\n\nprint(divide_numbers(10, 2))\n</code></pre>\n\n<p><strong>Разница с breakpoint():</strong></p>\n<ul>\n<li>Требует явного импорта <code>import pdb</code></li>\n<li>Не поддерживает настройку через переменные окружения</li>\n<li>Совместим с Python 2.7 и более старыми версиями Python 3</li>\n</ul>\n\n<h3>3. Запуск через командную строку: <code>python -m pdb</code></h3>\n\n<p>Запуск скрипта целиком под контролем отладчика.</p>\n\n<h4>Базовый синтаксис:</h4>\n<pre><code>python -m pdb script.py [аргументы_скрипта]\n</code></pre>\n\n<h4>Примеры:</h4>\n<pre><code># Запуск скрипта с отладкой с первой строки\npython -m pdb my_script.py\n\n# Запуск с аргументами\npython -m pdb my_script.py --input data.txt --output results.txt\n\n# Автоматическое продолжение до первой ошибки или breakpoint\npython -m pdb -c continue my_script.py\n</code></pre>\n\n<h4>Опции командной строки:</h4>\n<table border=\"1\" cellpadding=\"5\" cellspacing=\"0\">\n<tr>\n<th>Опция</th>\n<th>Описание</th>\n<th>Пример</th>\n</tr>\n<tr>\n<td><code>-c command</code></td>\n<td>Выполнить команды pdb как из .pdbrc</td>\n<td><code>python -m pdb -c \"break 10\" -c continue script.py</code></td>\n</tr>\n<tr>\n<td><code>-m module</code></td>\n<td>Отладка модуля (Python 3.7+)</td>\n<td><code>python -m pdb -m mypackage.module</code></td>\n</tr>\n<tr>\n<td><code>-p pid</code></td>\n<td>Подключиться к работающему процессу (Python 3.14+)</td>\n<td><code>python -m pdb -p 12345</code></td>\n</tr>\n</table>\n\n<h4>Удобный паттерн:</h4>\n<pre><code># Запустить программу, остановиться только при ошибке или breakpoint()\npython -m pdb -c continue script.py\n</code></pre>\n\n<h3>4. Программный запуск pdb</h3>\n\n<p>Запуск отладчика программно для выполнения кода, выражений или функций.</p>\n\n<h4>4.1. <code>pdb.run()</code> — выполнить statement</h4>\n<pre><code>import pdb\n\n# Отладка строки кода\npdb.run('my_function(42)')\n</code></pre>\n\n<h4>4.2. <code>pdb.runeval()</code> — выполнить и вернуть значение</h4>\n<pre><code>import pdb\n\n# Отладка выражения с возвратом результата\nresult = pdb.runeval('2 + 2 * 10')\nprint(f\"Результат: {result}\") # 22\n</code></pre>\n\n<h4>4.3. <code>pdb.runcall()</code> — вызвать функцию под отладчиком</h4>\n<pre><code>import pdb\n\ndef complex_calculation(x, y):\n return x ** 2 + y ** 2\n\n# Отладка вызова функции\nresult = pdb.runcall(complex_calculation, 3, 4)\nprint(f\"Результат: {result}\") # 25\n</code></pre>\n\n<h3>5. Post-mortem отладка: <code>pdb.pm()</code></h3>\n\n<p>Запуск отладчика после возникновения исключения для анализа причины ошибки.</p>\n\n<h4>В интерактивной оболочке:</h4>\n<pre><code>>>> import pdb\n>>> def buggy_function():\n... x = 10\n... y = 0\n... return x / y\n... \n>>> buggy_function()\nTraceback (most recent call last):\n ...\nZeroDivisionError: division by zero\n\n>>> pdb.pm() # Запустить отладчик в точке ошибки\n> buggy_function()\n-> return x / y\n(Pdb) p x\n10\n(Pdb) p y\n0\n</code></pre>\n\n<h4>В скрипте с обработкой исключений:</h4>\n<pre><code>import pdb\n\ntry:\n dangerous_operation()\nexcept Exception:\n pdb.post_mortem() # Отладка в момент исключения\n</code></pre>\n\n<h3>6. Отладка модуля: <code>python -m pdb -m</code></h3>\n\n<p>Отладка Python-модуля вместо скрипта (Python 3.7+).</p>\n\n<pre><code># Отладка модуля\npython -m pdb -m package.module\n\n# Пример: отладка HTTP-сервера\npython -m pdb -m http.server 8000\n</code></pre>\n\n<h3>Сравнение методов запуска</h3>\n\n<table border=\"1\" cellpadding=\"5\" cellspacing=\"0\">\n<tr>\n<th>Метод</th>\n<th>Когда использовать</th>\n<th>Преимущества</th>\n</tr>\n<tr>\n<td><code>breakpoint()</code></td>\n<td>Отладка конкретных участков кода</td>\n<td>Современный, гибкий, легко отключить</td>\n</tr>\n<tr>\n<td><code>pdb.set_trace()</code></td>\n<td>Совместимость с Python < 3.7</td>\n<td>Работает в старых версиях Python</td>\n</tr>\n<tr>\n<td><code>python -m pdb</code></td>\n<td>Отладка всего скрипта с начала</td>\n<td>Не нужно изменять код</td>\n</tr>\n<tr>\n<td><code>pdb.run*()</code></td>\n<td>Программная отладка выражений/функций</td>\n<td>Гибкость, можно использовать в тестах</td>\n</tr>\n<tr>\n<td><code>pdb.pm()</code></td>\n<td>Анализ уже произошедших ошибок</td>\n<td>Не нужно перезапускать программу</td>\n</tr>\n</table>\n\n<h3>Лучшие практики</h3>\n\n<ul>\n<li>✅ Используйте <code>breakpoint()</code> для отладки в процессе разработки</li>\n<li>✅ Используйте <code>python -m pdb -c continue</code> для отладки скриптов без изменения кода</li>\n<li>✅ Используйте <code>pdb.pm()</code> в интерактивной оболочке для анализа ошибок</li>\n<li>✅ Настройте <code>PYTHONBREAKPOINT=0</code> в production для отключения всех breakpoint</li>\n<li>❌ Не забывайте удалять <code>breakpoint()</code> перед коммитом в production-код</li>\n</ul>\n\n<p>В следующем уроке мы изучим таблицу всех команд pdb и научимся эффективно управлять процессом отладки.</p>", "video": null, "options": {}, "subtitle_files": [], "is_deprecated": false, "source": {}, "subtitles": {}, "tests_archive": null, "feedback_correct": "", "feedback_wrong": "" }, "id": null, "has_review": false, "time": "2026-01-27T00:00:00.000Z" }