【Linux】Linux环境基础开辟工具利用之Linux调试器-gdb利用
https://i-blog.csdnimg.cn/blog_migrate/629d272c9f89b32fc093c7f10e30105b.gif一、程序发布模式
程序的发布方式有两种,debug模式和release模式
1.1 debug模式
[*]目的:重要用于开辟和测试阶段,目的是让开辟者可以或许更容易地调试和跟踪程序中的错误(bugs),以确保软件在发布前无庞大错误。
[*]特性
[*]编译时不会举行过多的优化,以便更容易地通过调试工具(如GDB)查看程序的状态,包括变量值、函数调用栈等。
[*]包罗详细的调试信息(如符号表),这些信息对于理解程序的行为和定位题目至关重要。
[*]运行时可能包罗额外的查抄,如数组边界查抄、空指针查抄等,以帮助捕获潜在的错误。
[*]通常实行速度较慢,因为缺少优化并且增加了额外的调试信息。
1.2 release模式
[*]目的:用于将软件部署到生产环境,目的是提供稳定、高效的运行体验,将软件部署到生产环境,供最终用户利用。
[*]特性
[*]编译时会举行各种优化,如代码重排、循环展开、内联函数等,以提高程序的实行速度和服从。
[*]不包罗调试信息(如符号表),以减少可实行文件的大小并提高加载速度。
[*]移除所有运行时查抄(如数组边界查抄、空指针查抄等),以减少运行时开销。
[*]举行了严格的代码查抄和测试,以确保程序的稳定性和安全性。
[*]通常实行速度快,因为经过了优化并且去除了不须要的查抄。
二、默认发布模式
Linux gcc/g++出来的二进制程序,默认是release模式,在release模式下是无法举行调试的,要利用gdb调试,必须在源代码生成二进制程序的时候,加上 -g 选项。
那么要怎么才华证明上面的结论呢?
[*] 起首不带任何选项利用gcc编译Test.c文件生成可实行程序a.out,再利用gdb调试a.out,我们会发现没有调试信息。然后利用gcc带-g选项编译Test.c文件生成可实行程序a.out,再利用gdb调试a.out,会发现没有刚刚谁人提示。
https://i-blog.csdnimg.cn/direct/d49f979a02db461ca853daae82a6aaa8.png
https://i-blog.csdnimg.cn/direct/92451f4ac6814b2f92de5190e8ab5597.png
[*] 分别利用gcc以不带选项和带-g选项分别生成可实行程序release版本和debug版本,我们可以发现debug版本的大小比release版本的大,因为debug版本的可实行程序中添加了调试信息
https://i-blog.csdnimg.cn/direct/b0dfeb67ebaf4716ae573a909df3da99.png
[*] 我们在Linux中形成的可实行程序的格式为可实行与可链接格式(ELF格式),在Linux中,readelf是一个用于显示ELF文件信息的工具,我们可以利用readelf指令通过管道筛选出调试信息。
我们发现release版本下并没有调试信息,而debug版本下有调试信息。
https://i-blog.csdnimg.cn/direct/ee1ecc509ed54458860b837505dcd630.png
三、gdb的利用
gdb 文件名:进入调试
[*] list/l 行号:从输入的换行处显示源文件的源代码,接着前次的位置往下列,每次列10行。若没有输入行号,那么gdb会根据上下文开始显示源代码。
https://i-blog.csdnimg.cn/direct/c06d36394a7a464da982fba8e222024b.png
[*] list/l 函数名:显示函数的源代码。
https://i-blog.csdnimg.cn/direct/cd3b1d25783348d0ab6553af6a3ec90f.png
[*] break(b) 行号:在某一行设置断点
https://i-blog.csdnimg.cn/direct/089e15debbb64c9a8f539ff002e82a8c.png
[*] break 函数名:在某个函数开头设置断点
https://i-blog.csdnimg.cn/direct/2f9c1a3893904b76a108202a97689860.png
[*] info(i) break(或breakpoints) :查看断点信息。
https://i-blog.csdnimg.cn/direct/752658b0a59c4b8ca9568e8bfae7be70.png
[*] disable breakpoints n:禁用序号为n的断点
https://i-blog.csdnimg.cn/direct/dd412243660f418c87997a7d8077808c.png
[*] enable breakpoints n:启用序号为n的断点
https://i-blog.csdnimg.cn/direct/e463ea9dc87941219c2f044a7647f7f1.png
[*] delete(d) breakpoints n:删除序号为n的断点,断点的序号是线性增长的,只会越来越大,不会因为新添加的断点是前面删除的断点,导致新的断点的序号变为原来的序号。
https://i-blog.csdnimg.cn/direct/e4caa3404f634731af2f653c9c73a2f1.png
[*] delete(d) breakpoints:删除所有断点
https://i-blog.csdnimg.cn/direct/37151781d4e04c61990d7e082e07dccf.png
[*] r或run:当没有断点时运行程序,当有断点时运行到断点处。
https://i-blog.csdnimg.cn/direct/fbc9b9b453374ab9ba8e023e684f4fa8.png
[*] n 或 next:单步调试,当利用n命令举行单步调试时,gdb会实行下一行代码。如果下一行代码是一个函数调用,它会将函数调用的结果一次性显示出来,但不会深入到函数内部去逐行实行。
https://i-blog.csdnimg.cn/direct/c8b734755d1242c387386770355c1902.png
[*] s或step:单步调试,当利用s命令举行单步调试时,gdb同样会实行下一行代码。但是,如果下一行代码是一个函数调用,s命令会进入这个函数内部,并从函数的第一条语句开始逐行实行。这意。
https://i-blog.csdnimg.cn/direct/9836be459c8c48af80bbb67a21b212e3.png
[*] finish:实行到当前函数返回,然后挺下来等待命令
https://i-blog.csdnimg.cn/direct/7cdc7545641a49409b18259de618c0c9.png
[*] print ( p ):打印表达式的值,通过表达式可以修改变量的值或者调用函数
https://i-blog.csdnimg.cn/direct/8a99195665fd4bfe81858b92a70ac45b.png
[*] p 变量:打印变量值。
https://i-blog.csdnimg.cn/direct/5f9b2f6883f3427e9761f0abb8b8dfa3.png
[*] set var:修改变量的值
https://i-blog.csdnimg.cn/direct/ee8e2927ec5f4b949e8676e4e0a8df4c.png
[*] continue(或c):继续实行被调试的程序,直到遇到下一个断点、程序结束或遇到其他导致程序停止的事件。
https://i-blog.csdnimg.cn/direct/d44afd683c4a43e1868ba9bac799bae1.png
[*] display 变量名:跟踪查看一个变量,每次停下来都显示它的值
https://i-blog.csdnimg.cn/direct/ee2e4d98a6b04cfab8798e86b1150bf4.png
[*] undisplay n:取消对序号为n的变量的跟踪
https://i-blog.csdnimg.cn/direct/c9d870e0e29648a2b824775eb1d289cf.png
[*] until :重要作用是继续实行程序,直到当前栈帧(通常是当前函数)的返回点,或者遇到下一个断点。
[*] until n:n为某一行代码的行号,该命令会使程序运行至第n行代码处停止。
https://i-blog.csdnimg.cn/direct/b5857bd0da884e61bcfcdfdea240dda9.png
[*] breaktrace(或bt):查看各级函数调用及参数
https://i-blog.csdnimg.cn/direct/2500a4367b8f4b699eb08472ec07e6d5.png
[*] info (i) locals:查看当前栈帧局部变量的值
https://i-blog.csdnimg.cn/direct/1a530fb282be4cc7a8105a648e05df72.png
[*] quit (q):退出gdb
末端
如果有什么发起和疑问,或是有什么错误,各人可以在评论区中提出。
希望各人以后也能和我一起进步!!
页:
[1]