[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"page-ru-/guides/linux/debugging-c":3,"mdc-z7obig-key":596,"mdc-lyakcw-key":615,"mdc-kbmlv-key":632,"mdc--lpqb8j-key":672,"mdc-n0n7o7-key":688,"mdc-myxr2c-key":712,"mdc-f72opf-key":727,"mdc--qr10po-key":757,"mdc--27pk3a-key":794,"related-/guides/linux/compiling-c,/guides/linux/using-gdb,/guides/linux/valgrind-usage":817},{"id":4,"title":5,"appliesTo":6,"author":9,"body":10,"canonical":525,"code":86,"createdAt":526,"description":527,"difficulty":528,"draft":529,"estimatedTime":530,"extension":531,"faq":532,"howToSteps":545,"howToTotalTime":561,"image":525,"keywords":562,"locale":573,"meta":574,"navigation":575,"path":576,"platform":577,"related":578,"section":582,"seo":583,"severity":86,"stem":584,"summary":585,"tags":586,"twitterCreator":525,"twitterSite":525,"type":594,"updatedAt":526,"__hash__":595},"content_ru/guides/linux/debugging-c.md","Отладка C-кода на Linux: руководство по GDB, Valgrind и ASan",[7,8],"gcc 11+, clang 14+","Ubuntu 22.04, Debian 12, Fedora 38","FixPedia Team",{"type":11,"value":12,"toc":512},"minimark",[13,18,22,26,68,72,77,80,128,131,164,168,171,197,211,215,218,261,268,272,275,314,317,350,361,365,371,383,386,392,420,423,426,430,433,461,465,505,508],[14,15,17],"h2",{"id":16},"введение","Введение",[19,20,21],"p",{},"Отладка C-программ на Linux может показаться сложной, но правильные инструменты и методика значительно ускоряют поиск и устранение ошибок. В этом руководстве вы научитесь настраивать среду разработки, запускать программу с отладочными символами, использовать GDB для пошагового выполнения и просмотра данных, а также применять Valgrind и AddressSanitizer для обнаружения ошибок памяти и процессных проблем. После выполнения этих шагов вы сможете быстро выявлять утечки, ошибки сегментации и логические ошибки в своем коде.",[14,23,25],{"id":24},"требования-подготовка","Требования / Подготовка",[27,28,29,50,56,62],"ul",{},[30,31,32,36],"li",{},[33,34,35],"strong",{},"Компиляторы и отладочные инструменты",[27,37,38,41,44,47],{},[30,39,40],{},"GCC версии 11 или выше (или clang 14+ для ASan).",[30,42,43],{},"GDB (GNU Debugger).",[30,45,46],{},"Valgrind для анализа памяти.",[30,48,49],{},"Необязательно: clang+llvm для более удобного ASan.",[30,51,52,55],{},[33,53,54],{},"Права доступа"," – для установки пакетов требуется sudo.",[30,57,58,61],{},[33,59,60],{},"Версии ОС"," – руководство протестировано на Ubuntu 22.04, Debian 12 и Fedora 38.",[30,63,64,67],{},[33,65,66],{},"Предварительно написанный код"," – простая C-программа, например, с использованием динамического выделения памяти, для демонстрации отладки.",[14,69,71],{"id":70},"пошаговая-инструкция","Пошаговая инструкция",[73,74,76],"h3",{"id":75},"шаг-1-установите-необходимые-инструменты","Шаг 1: Установите необходимые инструменты",[19,78,79],{},"Убедитесь, что установлены все необходимые инструменты. На Ubuntu/Debian выполните:",[81,82,87],"pre",{"className":83,"code":84,"language":85,"meta":86,"style":86},"language-bash shiki shiki-themes github-light github-dark","sudo apt update\nsudo apt install build-essential gdb valgrind clang\n","bash","",[88,89,90,106],"code",{"__ignoreMap":86},[91,92,95,99,103],"span",{"class":93,"line":94},"line",1,[91,96,98],{"class":97},"sScJk","sudo",[91,100,102],{"class":101},"sZZnC"," apt",[91,104,105],{"class":101}," update\n",[91,107,109,111,113,116,119,122,125],{"class":93,"line":108},2,[91,110,98],{"class":97},[91,112,102],{"class":101},[91,114,115],{"class":101}," install",[91,117,118],{"class":101}," build-essential",[91,120,121],{"class":101}," gdb",[91,123,124],{"class":101}," valgrind",[91,126,127],{"class":101}," clang\n",[19,129,130],{},"На Fedora:",[81,132,134],{"className":83,"code":133,"language":85,"meta":86,"style":86},"sudo dnf groupinstall \"Development Tools\"\nsudo dnf install gdb valgrind clang-tools-extra\n",[88,135,136,149],{"__ignoreMap":86},[91,137,138,140,143,146],{"class":93,"line":94},[91,139,98],{"class":97},[91,141,142],{"class":101}," dnf",[91,144,145],{"class":101}," groupinstall",[91,147,148],{"class":101}," \"Development Tools\"\n",[91,150,151,153,155,157,159,161],{"class":93,"line":108},[91,152,98],{"class":97},[91,154,142],{"class":101},[91,156,115],{"class":101},[91,158,121],{"class":101},[91,160,124],{"class":101},[91,162,163],{"class":101}," clang-tools-extra\n",[73,165,167],{"id":166},"шаг-2-скомпилируйте-программу-с-отладочными-символами","Шаг 2: Скомпилируйте программу с отладочными символами",[19,169,170],{},"Для эффективной отладки программа должна содержать отладочную информацию и не содержать оптимизацию. Используйте следующие команды:",[81,172,174],{"className":83,"code":173,"language":85,"meta":86,"style":86},"gcc -g -O0 main.c -o program\n",[88,175,176],{"__ignoreMap":86},[91,177,178,181,185,188,191,194],{"class":93,"line":94},[91,179,180],{"class":97},"gcc",[91,182,184],{"class":183},"sj4cs"," -g",[91,186,187],{"class":183}," -O0",[91,189,190],{"class":101}," main.c",[91,192,193],{"class":183}," -o",[91,195,196],{"class":101}," program\n",[27,198,199,205],{},[30,200,201,204],{},[88,202,203],{},"-g"," добавляет отладочные символы.",[30,206,207,210],{},[88,208,209],{},"-O0"," отключает оптимизацию, что упрощает сопоставление строк кода с исходным файлом.",[73,212,214],{"id":213},"шаг-3-запустите-программу-под-gdb","Шаг 3: Запустите программу под GDB",[19,216,217],{},"Запустите GDB и установите точку останова на главной функции:",[81,219,221],{"className":83,"code":220,"language":85,"meta":86,"style":86},"gdb ./program\n(gdb) break main\n(gdb) run\n",[88,222,223,231,249],{"__ignoreMap":86},[91,224,225,228],{"class":93,"line":94},[91,226,227],{"class":97},"gdb",[91,229,230],{"class":101}," ./program\n",[91,232,233,237,239,242,246],{"class":93,"line":108},[91,234,236],{"class":235},"sVt8B","(",[91,238,227],{"class":97},[91,240,241],{"class":235},") ",[91,243,245],{"class":244},"szBVR","break",[91,247,248],{"class":101}," main\n",[91,250,252,254,256,258],{"class":93,"line":251},3,[91,253,236],{"class":235},[91,255,227],{"class":97},[91,257,241],{"class":235},[91,259,260],{"class":97},"run\n",[19,262,263,264,267],{},"Программа остановится на первой строке ",[88,265,266],{},"main",". Теперь вы можете исследовать состояние программы.",[73,269,271],{"id":270},"шаг-4-осмотрите-состояние-программы-в-gdb","Шаг 4: Осмотрите состояние программы в GDB",[19,273,274],{},"Просмотрите значения переменных:",[81,276,278],{"className":83,"code":277,"language":85,"meta":86,"style":86},"(gdb) print myVar\n(gdb) p &myVar      # адрес в памяти\n",[88,279,280,294],{"__ignoreMap":86},[91,281,282,284,286,288,291],{"class":93,"line":94},[91,283,236],{"class":235},[91,285,227],{"class":97},[91,287,241],{"class":235},[91,289,290],{"class":183},"print",[91,292,293],{"class":101}," myVar\n",[91,295,296,298,300,302,304,307,310],{"class":93,"line":108},[91,297,236],{"class":235},[91,299,227],{"class":97},[91,301,241],{"class":235},[91,303,19],{"class":97},[91,305,306],{"class":235}," &",[91,308,309],{"class":97},"myVar",[91,311,313],{"class":312},"sJ8bj","      # адрес в памяти\n",[19,315,316],{},"Перейдите к следующей строке кода:",[81,318,320],{"className":83,"code":319,"language":85,"meta":86,"style":86},"(gdb) next          # выполнить одну строку, не входя в функции\n(gdb) step          # выполнить шаг с входом в функции\n",[88,321,322,336],{"__ignoreMap":86},[91,323,324,326,328,330,333],{"class":93,"line":94},[91,325,236],{"class":235},[91,327,227],{"class":97},[91,329,241],{"class":235},[91,331,332],{"class":97},"next",[91,334,335],{"class":312},"          # выполнить одну строку, не входя в функции\n",[91,337,338,340,342,344,347],{"class":93,"line":108},[91,339,236],{"class":235},[91,341,227],{"class":97},[91,343,241],{"class":235},[91,345,346],{"class":97},"step",[91,348,349],{"class":312},"          # выполнить шаг с входом в функции\n",[19,351,352,353,356,357,360],{},"Для вывода нескольких переменных одновременно используйте ",[88,354,355],{},"info locals",". Если вам нужны более подробные данные, выполните ",[88,358,359],{},"display /x $pc"," для просмотра текущего адреса.",[73,362,364],{"id":363},"шаг-5-проверьте-утечки-памяти-с-помощью-valgrind-или-addresssanitizer","Шаг 5: Проверьте утечки памяти с помощью Valgrind или AddressSanitizer",[19,366,367,370],{},[33,368,369],{},"Valgrind"," — это полный инструмент для анализа памяти, который обнаруживает утечки, ошибки доступа и т. д.:",[81,372,374],{"className":83,"code":373,"language":85,"meta":86,"style":86},"valgrind ./program\n",[88,375,376],{"__ignoreMap":86},[91,377,378,381],{"class":93,"line":94},[91,379,380],{"class":97},"valgrind",[91,382,230],{"class":101},[19,384,385],{},"Вывод Valgrind укажет номер строки и функцию, где возникает проблема.",[19,387,388,391],{},[33,389,390],{},"AddressSanitizer (ASan)"," — это быстрая проверка, которая добавляется во время компиляции:",[81,393,395],{"className":83,"code":394,"language":85,"meta":86,"style":86},"gcc -g -fsanitize=address -O1 main.c -o program\n./program\n",[88,396,397,415],{"__ignoreMap":86},[91,398,399,401,403,406,409,411,413],{"class":93,"line":94},[91,400,180],{"class":97},[91,402,184],{"class":183},[91,404,405],{"class":183}," -fsanitize=address",[91,407,408],{"class":183}," -O1",[91,410,190],{"class":101},[91,412,193],{"class":183},[91,414,196],{"class":101},[91,416,417],{"class":93,"line":108},[91,418,419],{"class":97},"./program\n",[19,421,422],{},"ASan выводит сообщения прямо в stderr и часто быстрее Valgrind при быстром тестировании.",[424,425],"in-article-ad",{},[14,427,429],{"id":428},"проверка-результата","Проверка результата",[19,431,432],{},"После отладки убедитесь, что все ошибки устранены:",[27,434,435,449,455],{},[30,436,437,440,441,444,445,448],{},[33,438,439],{},"Core‑дампы"," – если программа упала с сигналом, проверьте наличие файла core в текущей директории (",[88,442,443],{},"ls core.*","). Это полезно для последующего анализа в GDB (",[88,446,447],{},"gdb ./program core",").",[30,450,451,454],{},[33,452,453],{},"Valgrind/ASan отчеты"," – убедитесь, что список обнаруженных проблем пуст (нет сообщений об утечках или недопустимых доступах).",[30,456,457,460],{},[33,458,459],{},"Функциональность"," – запустите программу с различными входными данными, чтобы убедиться, что поведение теперь соответствует ожиданиям.",[14,462,464],{"id":463},"возможные-проблемы","Возможные проблемы",[27,466,467,480,493,499],{},[30,468,469,472,473,475,476,479],{},[33,470,471],{},"Отсутствие отладочной информации"," – если GDB не может найти символы, вероятно, программа была скомпилирована без флага ",[88,474,203],{},". Перекомпилируйте с использованием ",[88,477,478],{},"gcc -g -O0",".",[30,481,482,485,486,489,490,479],{},[33,483,484],{},"Core‑дампы не создаются"," – установите soft limit с помощью ",[88,487,488],{},"ulimit -c unlimited"," перед запуском программы. На некоторых системах требуется изменить ",[88,491,492],{},"/proc/sys/kernel/core_pattern",[30,494,495,498],{},[33,496,497],{},"Valgrind работает медленно"," – для больших программ Valgrind может быть слишком медленным. В этом случае используйте ASan для быстрой проверки и Valgrind только для конкретных тестовых случаев.",[30,500,501,504],{},[33,502,503],{},"Ложные срабатывания ASan"," – иногда false‑positive сообщения возникают из-за использования неинициализированных указателей. Проверьте, инициализированы ли указатели перед использованием.",[19,506,507],{},"Следуя этому руководству, вы сможете быстро находить и исправлять ошибки в C-программах на Linux, используя стандартный набор инструментов. Удачной отладки!",[509,510,511],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":86,"searchDepth":108,"depth":108,"links":513},[514,515,516,523,524],{"id":16,"depth":108,"text":17},{"id":24,"depth":108,"text":25},{"id":70,"depth":108,"text":71,"children":517},[518,519,520,521,522],{"id":75,"depth":251,"text":76},{"id":166,"depth":251,"text":167},{"id":213,"depth":251,"text":214},{"id":270,"depth":251,"text":271},{"id":363,"depth":251,"text":364},{"id":428,"depth":108,"text":429},{"id":463,"depth":108,"text":464},null,"2026-07-31 13:42:04","Узнайте, как эффективно отлаживать C-программы на Linux. Пошаговое руководство по использованию GDB, Valgrind и AddressSanitizer для поиска ошибок, утечек памяти и процессных проблем.","medium",false,"10-15 мин","md",[533,536,539,542],{"question":534,"answer":535},"Как скомпилировать C-программу с отладочными символами?","Добавьте флаг -g и отключите оптимизацию -O0: `gcc -g -O0 main.c -o program`.",{"question":537,"answer":538},"Что делать, если программа падает с ошибкой сегментации?","Запустите программу под Valgrind: `valgrind ./program`, чтобы увидеть место и причину сбоя.",{"question":540,"answer":541},"Как установить точку останова и просмотреть переменные в GDB?","В GDB выполните `break main`, затем `run`. После остановки выведите переменную командой `print myVar` или `p myVar`.",{"question":543,"answer":544},"Как включить генерацию core‑дампов?","Установите `ulimit -c unlimited`, затем выполните программу. Core файлы сохраняются в текущей директории.",[546,549,552,555,558],{"name":547,"text":548},"Установите необходимые инструменты","На Ubuntu/Debian выполните: `sudo apt install build-essential gdb valgrind clang`. На Fedora: `sudo dnf install gcc gdb valgrind clang-tools-extra`.",{"name":550,"text":551},"Скомпилируйте программу с отладочными символами","Используйте флаг -g для отладочной информации и -O0 для отключения оптимизации: `gcc -g -O0 main.c -o program`.",{"name":553,"text":554},"Запустите программу под GDB","Запустите отладчик: `gdb ./program`. Установите точку останова на главной функции: `break main`. Запустите программу: `run`.",{"name":556,"text":557},"Осмотрите состояние программы в GDB","После остановки выведите значение переменной: `print myVar`. Перейдите к следующей строке: `next`. Выполните один шаг: `step`. Для вывода адреса: `p &myVar`.",{"name":559,"text":560},"Проверьте утечки памяти с помощью Valgrind или AddressSanitizer","Для полного анализа памяти запустите под Valgrind: `valgrind ./program`. Быстрая проверка с использованием ASan: `gcc -g -fsanitize=address -O1 main.c -o program && ./program`.","PT15M",[563,564,565,566,567,568,569,570,571,572],"отладка C-кода","GDB отладка","Valgrind утечка памяти","AddressSanitizer Linux","отладочные символы gcc","пошаговая отладка программы","отладка сегментации","поиск ошибок в C","как использовать gdb","отладка без core dump","ru_RU",{},true,"/guides/linux/debugging-c","linux",[579,580,581],"/guides/linux/compiling-c","/guides/linux/using-gdb","/guides/linux/valgrind-usage","Гайды Linux",{"title":5,"description":527},"guides/linux/debugging-c","В этом руководстве вы узнаете, как настроить среду разработки для отладки C-кода на Linux, запускать программу с отладочными символами, использовать GDB для пошагового выполнения и просмотра данных, а также применять Valgrind и AddressSanitizer для обнаружения ошибок памяти.",[587,588,589,590,369,591,592,593],"C","GDB","Linux","debugging","AddressSanitizer","отладка","memory","guide","OXWuSI0UFQEcIOHKhQuxeTIPp6B2O3tP77VlYeXmhCI",{"data":597,"body":598},{},{"type":599,"children":600},"root",[601],{"type":602,"tag":19,"props":603,"children":604},"element",{},[605,608,614],{"type":606,"value":607},"text","Добавьте флаг -g и отключите оптимизацию -O0: ",{"type":602,"tag":88,"props":609,"children":611},{"className":610},[],[612],{"type":606,"value":613},"gcc -g -O0 main.c -o program",{"type":606,"value":479},{"data":616,"body":617},{},{"type":599,"children":618},[619],{"type":602,"tag":19,"props":620,"children":621},{},[622,624,630],{"type":606,"value":623},"Запустите программу под Valgrind: ",{"type":602,"tag":88,"props":625,"children":627},{"className":626},[],[628],{"type":606,"value":629},"valgrind ./program",{"type":606,"value":631},", чтобы увидеть место и причину сбоя.",{"data":633,"body":634},{},{"type":599,"children":635},[636],{"type":602,"tag":19,"props":637,"children":638},{},[639,641,647,649,655,657,663,665,671],{"type":606,"value":640},"В GDB выполните ",{"type":602,"tag":88,"props":642,"children":644},{"className":643},[],[645],{"type":606,"value":646},"break main",{"type":606,"value":648},", затем ",{"type":602,"tag":88,"props":650,"children":652},{"className":651},[],[653],{"type":606,"value":654},"run",{"type":606,"value":656},". После остановки выведите переменную командой ",{"type":602,"tag":88,"props":658,"children":660},{"className":659},[],[661],{"type":606,"value":662},"print myVar",{"type":606,"value":664}," или ",{"type":602,"tag":88,"props":666,"children":668},{"className":667},[],[669],{"type":606,"value":670},"p myVar",{"type":606,"value":479},{"data":673,"body":674},{},{"type":599,"children":675},[676],{"type":602,"tag":19,"props":677,"children":678},{},[679,681,686],{"type":606,"value":680},"Установите ",{"type":602,"tag":88,"props":682,"children":684},{"className":683},[],[685],{"type":606,"value":488},{"type":606,"value":687},", затем выполните программу. Core файлы сохраняются в текущей директории.",{"data":689,"body":690},{},{"type":599,"children":691},[692],{"type":602,"tag":19,"props":693,"children":694},{},[695,697,703,705,711],{"type":606,"value":696},"На Ubuntu/Debian выполните: ",{"type":602,"tag":88,"props":698,"children":700},{"className":699},[],[701],{"type":606,"value":702},"sudo apt install build-essential gdb valgrind clang",{"type":606,"value":704},". На Fedora: ",{"type":602,"tag":88,"props":706,"children":708},{"className":707},[],[709],{"type":606,"value":710},"sudo dnf install gcc gdb valgrind clang-tools-extra",{"type":606,"value":479},{"data":713,"body":714},{},{"type":599,"children":715},[716],{"type":602,"tag":19,"props":717,"children":718},{},[719,721,726],{"type":606,"value":720},"Используйте флаг -g для отладочной информации и -O0 для отключения оптимизации: ",{"type":602,"tag":88,"props":722,"children":724},{"className":723},[],[725],{"type":606,"value":613},{"type":606,"value":479},{"data":728,"body":729},{},{"type":599,"children":730},[731],{"type":602,"tag":19,"props":732,"children":733},{},[734,736,742,744,749,751,756],{"type":606,"value":735},"Запустите отладчик: ",{"type":602,"tag":88,"props":737,"children":739},{"className":738},[],[740],{"type":606,"value":741},"gdb ./program",{"type":606,"value":743},". Установите точку останова на главной функции: ",{"type":602,"tag":88,"props":745,"children":747},{"className":746},[],[748],{"type":606,"value":646},{"type":606,"value":750},". Запустите программу: ",{"type":602,"tag":88,"props":752,"children":754},{"className":753},[],[755],{"type":606,"value":654},{"type":606,"value":479},{"data":758,"body":759},{},{"type":599,"children":760},[761],{"type":602,"tag":19,"props":762,"children":763},{},[764,766,771,773,778,780,785,787,793],{"type":606,"value":765},"После остановки выведите значение переменной: ",{"type":602,"tag":88,"props":767,"children":769},{"className":768},[],[770],{"type":606,"value":662},{"type":606,"value":772},". Перейдите к следующей строке: ",{"type":602,"tag":88,"props":774,"children":776},{"className":775},[],[777],{"type":606,"value":332},{"type":606,"value":779},". Выполните один шаг: ",{"type":602,"tag":88,"props":781,"children":783},{"className":782},[],[784],{"type":606,"value":346},{"type":606,"value":786},". Для вывода адреса: ",{"type":602,"tag":88,"props":788,"children":790},{"className":789},[],[791],{"type":606,"value":792},"p &myVar",{"type":606,"value":479},{"data":795,"body":796},{},{"type":599,"children":797},[798],{"type":602,"tag":19,"props":799,"children":800},{},[801,803,808,810,816],{"type":606,"value":802},"Для полного анализа памяти запустите под Valgrind: ",{"type":602,"tag":88,"props":804,"children":806},{"className":805},[],[807],{"type":606,"value":629},{"type":606,"value":809},". Быстрая проверка с использованием ASan: ",{"type":602,"tag":88,"props":811,"children":813},{"className":812},[],[814],{"type":606,"value":815},"gcc -g -fsanitize=address -O1 main.c -o program && ./program",{"type":606,"value":479},[]]