如何使用GDB从多个文件中找到分段错误

我在面试中被问到如何使用GDB在C程序中调试分段错误

我告诉他们我们可以使用-g选项编译我们的程序,因为它可以将调试信息添加到二进制文件中并且可以读取核心转储文件但是然后面试官告诉我他们是否有3到4个文件一起编译但是其中一个导致了分段错误然后我们如何在GDB中调试?

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

GDB将正常运行程序,当发生分段错误时,GDB将回退到它的提示符,它几乎与运行带有核心文件的GDB相同。 主要区别在于,当程序在GDB内部崩溃时,您可以使用核心文件执行某些操作/打印。 (例如,您可以使用print来调用程序中的某些函数。)

您还可以使用gdb --pid 附加到已在运行的程序。

无论是使用核心文件还是使用上述方法之一,当崩溃后都有GDB提示时,键入backtrace (或简称bt ),GDB会在崩溃时向您显示堆栈,包括文件名和每个呼叫的行号和当前正在执行的行。

如果您在Linux下工作,更容易找到分段错误的方法是使用名为VALGRIND的工具: http ://valgrind.org/。

您只需要使用-g标志编译代码,然后运行./valgrind。

然后,您将确切地知道在哪个函数和哪行代码中存在错误未初始化的内存/内存从已分配的空间或某些空间中读出。

您只需在gdb下运行该程序,然后调试器捕获SIGSEGV并向您显示出现故障的行和指令。 然后你只需检查变量和/或寄存器值,看看有什么不对。 通常它是一个流氓指针值,并且试图用GDB访问它会给出错误,所以很容易。

是的,用-g重新编译所有内容会很有帮助。 面试官可能希望你描述如何找出哪个文件有错误(gdb只是告诉你它何时捕获到信号)并且只是用调试信息重新编译那个文件。 如果有20,000个源文件可能有用,但有3个或4个文件,那有什么意义呢? 即使有较大的项目,你通常最终会通过10个函数和5个文件来追逐坏指针,所以再一次,重点是什么? 调试信息在运行时不需要任何费用,但它会在安装中占用磁盘空间。

通过给出gcc文件名以正常方式编译代码,你将得到一个.out文件,开始运行它并通过给ps -aef | grep filename.out获取进程id ps -aef | grep filename.out

在另一个窗口中键入gdb并输入,在gdb提示符下面给attach processid (processid你将从上面的命令得到),给c继续。执行完成后给gdb里面的“bt”。你会得到分区所在的地方发生。

听起来他们正在设置它以便您可以在运行时逐步执行代码,您可以使用命令行版本执行此操作,或者我认为您可以获取GDB的GUI。

可以使用以下步骤使用gdb调试分段错误

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