Intereting Posts
Возrotation локального статического элемента в C Сравнение между символом в строке с заданным символом Как извлечь определенные «n» биты 32-разрядного целого числа без знака в C? Предоставление цвета примитивам в OpenGL с использованием объектов буфера Vertex Библиотека C / C ++ для VTK IO Функция system () открывает окно Как создать образ загрузочного компакт-диска с моим kernelм? Компрессор ASCII работает для короткого тестового файла, а не на длинных Как найти ошибку сегментации из нескольких файлов с помощью GDB Как вызывается следующая программа `C89` при компиляции в режиме C89 и` C99` при компиляции в режиме C99? Cython эквивалент c определяет #define myfunc (узел x, …) SetNode (x.getattributeNode (), __ VA_ARGS__) Как сгенерировать GUID в C? используя scanf для проверки входных параметров warning: неявное объявление функции при компиляции источника C Разрешение предупреждения о преобразовании в составном назначении

Как найти ошибку сегментации из нескольких файлов с помощью GDB

Меня спросили в интервью, как вы можете отлаживать ошибку сегментации в программе на C с помощью GDB .

Я сказал им, что мы можем скомпилировать нашу программу с опцией -g чтобы она добавляла отладочную информацию в двоичный файл и могла читать файл дампа ядра, но затем интервьюер сказал мне, если у нас есть с 3 по 4 файла, скомпилированные вместе, но один из них вызывает ошибку сегментации, тогда как мы отлаживаем работу в GDB?

 $ gcc -ggdb s1.c s2.c s3.c -o myprog $ gdb myprog (gdb) run --arg1 --arg2 

GDB будет запускать программу как обычно, когда произойдет segmentation fault. GDB вернется к своей подсказке и будет почти такой же, как запуск GDB с основным файлом. Основное различие заключается в том, что вы не можете делать / печатать с основным файлом, который вы можете, когда программа врезалась в GDB. (Например, вы можете использовать print для вызова некоторых функций внутри программы.)

Вы также можете подключиться к уже запущенной программе, используя gdb --pid .

Либо с базовым файлом, либо с одним из вышеперечисленных методов, когда у вас есть приглашение GDB после сбоя, введите backtrace (или bt для краткости), и GDB покажет вам стек во время сбоя, включая имена файлов и номера строк каждого вызова и текущей строки.

Если вы работаете под Linux, проще найти ошибку сегментации, используя инструмент VALGRIND: http://valgrind.org/ .

Вам просто нужно скомпилировать свой код с флагом -g, а затем запустить ./valgrind.

Тогда вы точно узнаете, в какой функции и в какой строке кода есть ошибка-неинициализированная память / память, считываемая из выделенного пространства или sth.

Вы просто запускаете программу под gdb, а отладчик с улавливанием SIGSEGV и показываете вам строку и инструкцию, которые сбой. Затем вы просто проверяете значения переменных и / или регистров, чтобы узнать, что не так. Обычно это значение указателя мошенничества, и попытка получить доступ к нему с помощью GDB даст и ошибки, так что это легко.

И да, перекомпилировать все с помощью -g было бы полезно. Вероятно, интервьюер хотел, чтобы вы описали, как вы выяснили, какой файл был виноват (gdb просто сообщает вам, когда он ловит сигнал), и просто перекомпилируйте этот файл с информацией об отладке. Если есть 20 000 исходных файлов, которые могут быть полезны, но с 3 или 4 файлами, в чем смысл? Даже с более крупными проектами, вы, как правило, в конечном итоге преследуете плохой указатель через 10 функций и 5 файлов, так что опять-таки, в чем смысл? Отладочная информация не стоит ничего во время выполнения, хотя она занимает дисковое пространство в процессе установки.

скомпилируйте код в обычном режиме, предоставив gcc filename, вы получите файл .out , начнете его запускать и получите идентификатор процесса, предоставив ps -aef | grep filename.out ps -aef | grep filename.out

в другом окне типа gdb и введите, внутри gdb prompt дать attach processid (processid вы получите из вышеприведенной команды), дать c для продолжения. Если выполнение заканчивается, дайте «bt» внутри gdb.you получите место, где сегментирование происходит.

Похоже, они хотят настроить его, чтобы вы могли выполнить код во время его запуска, вы можете сделать это с помощью командной строки или я думаю, что вы можете получить графический интерфейс для GDB.

для отладки сегментации с помощью gdb можно использовать следующие шаги

 $ gdb  $ r //run the pgm $ where $ f <1> <0> //to view the function n variables $ list $ p