随笔分类 - GDB
摘要:1. 生成debug版本,strip出release版本发给客户:strip -g program_debug -o program_release 然后通过DEBUG版本进行调试release程序:gdb --symbol=program_debug -exec=program_release2.
阅读全文
摘要:1)thread apply all tb:大概查看一下所有线程堆栈情况,或者通过过滤,看看是否可以看一些问题2)逐个线程排查 a. thread 线程编号:切换到指定线程 b. bt:查看堆栈 c. f 帧号:切换到我们关注的自己代码的栈帧 d. l :查看帧附近的代码,确认代码是否在等待相关资源
阅读全文
摘要:1. 代码片段: 2. GDB执行分析: 1)断点到代码行19,并且运行到代码行19 2)启用反向执行功能:record,该命令必须在程序运行起来执行。3)下一步,来到调用子函数my_print的代码行204)进入子函数my_print的第一行55)一路n,来到代码行126)一路rn(反向执行),来
阅读全文
摘要:1. 概要: 1). jump/j 行号,如果该行号有断点,则停止,如果没有断点,则继续执行,直到遇到断点或者程序终止 2). 可以跳转到其他函数,但是强烈不建议跳转到其他函数(因为这么跳转通常会导致程序异常终止) 2. 例子: 1)首次要断点的代码行20 2)要重复执行的代码片段3)重复执行的时候
阅读全文
摘要:1)加载无符号表程序 2)断点到某一个函数,通过tab键可以模糊匹配查找要断点的函数3)运行程序4)查看第一个参数寄存器:i r rdi,我们传入的是字符a,可以看到查看到的值是97(字符a的ascii),符合预期。5)查看第二个参数寄存器:i r rsi,我们传入的是整数876,可以看到查看到的值
阅读全文
摘要:1. 修改寄存器,跳过某些行代码 1)代码行10,要打断点的代码 2)代码行12,在行10下一步后,希望进入代码行12(跳过执行代码行11)3)期望代码行13输出0(因为代码行10没有执行,所以c的值仍然为原始值) 4)在行10打断点5)在程序run起来后,程序停在行10,查看行10的地址:i li
阅读全文
摘要:说明: gdb中使用“x”命令来打印内存的值,格式为“x/nfu addr”。含义为以f格式打印从addr开始的n个长度单元为u的内存值。参数具体含义如下:a)n:输出单元的个数。b)f:是输出格式。比如x是以16进制形式输出,o是以8进制形式输出,等等。c)u:标明一个单元的长度。b是一个byte
阅读全文
摘要:l. list操作1). 向前显示固定行数的代码:l - 2). 查看指定函数的代码:l test_func,如果多个文件包含这个函数,那么会显示多个函数的定义代码,包括类中的方法。3). 查看指定类的函数的代码: l Person:print_self4). 显示指指定文件某行的代码: l tes
阅读全文
摘要:在编译链接的时候,添加编译选项:-fsanitize=address,如下:g++ -std=c++11 -g -fsanitize=address a_test.cpp -o a_test 1. 内存泄漏问题: 1) 泄漏代码位置,行号为:7。 2)执行编译后的二进制。 3)发现的问题类型:内存泄
阅读全文
摘要:总体思路:在方法最开始获取一下内存状态,在方法结束之前获取一下内存状态,看看两者是否有差异,如果有差异,说明了有内存泄漏 1. 调试初始状态 1). 分配内存代码,行号为10 2). 释放内存代码,行号为113). 断点到行号104). 运行代码5). 运行停在行号10 2. 方法内存变化分析: 1
阅读全文
摘要:1. 直接在gdb窗口执行shell命令gdb窗口执行shell命令:1) shell ps -ef | grep python2) ! ps -ef | grep python这里的grep当期也可以使其他linux命令,比如wc等等,第二种写法是一种写法的简写 2. 管道过滤:1) pipe i
阅读全文
摘要:1. 线程的基本操作 1).查看所有线程 : info/i threads,linux下的线程是轻量级线程,可以通过命令ps -aL查看所有的轻量级线程2).线程切换:thread 线程编号;3).查找线程: thread find 关键字,这样就查找了线程(名字/地址/LWP)包含关键字的线程4)
阅读全文
摘要:1. whatis查看类型:a. 查看变量类型:eg: whatis one_personb. 查看函数定义:eg: whatis func_name,如果有多个同名的函数,那么只能看到一个 c. 查看某个类的函数定义:whatis Person::app1,查看的是对象成员,而不是类成员,可以使用
阅读全文
摘要:断点设置1. 指定文件文件的行号设置断点,eg: b test.cpp:10, 这种设置断点的方式,如果整个项目中有多个test.cpp文件,那么每个文件对应的行都会被设置为断点2. 指定函数名字设置断点,如果有多个名字相同的,那么多个名字的函数都会被设置, eg: b exec_worker,如果
阅读全文
摘要:1. 产生带有调试符号的二进制 2. 启动gdb 1)启动命令 2)表示Reading symbols 成功,表示加载调试符号成功。 3. 基本命令如下: 1). 查看源代码:list/l2). 在函数上设置断点 b main,就在main函数的第一行设置了断点3). 在文件上设置断点 b a.cp
阅读全文
摘要:执行命令:ulimit -c,返回0:表示不会在崩溃的时候自动生成core dump文件ulimit -c unlimited,这样只要系统不重启,就会生效,表示对core文件的大小无限制 在系统文件/etc/security/limits.conf中添加如下代码,可以确保core的设置永久生效*
阅读全文