最近使用多线程,老是出现未知错误,比如程序死锁,或者线程突然挂掉,由于是多线程编程,单纯使用cout找不到出错点,只有学好gdb调试才能解决问题.
首先参考https://blog.csdn.net/liigo/article/details/582231
学习的知识点为新建Debug工程,进入gdb调试,加载调试程序,设置断点,查看变量名,单步调试,继续,结束
新建工程gdbtest,在CmakeLists中设置编译选项为debug,使用命令
add_compile_options(-std=c++11 -g)
main.cpp如下
#include
int nGlobalVar =0;
int tempFunction(int a,int b)
{
printf("tempFunction is called, a = %d, b = %d /n",a,b);
return (a +b);
}
int main()
{
int n;
n = 1;
n++;
n--;
nGlobalVar += 100;
nGlobalVar -= 12;
printf("n = %d, nGlobalVar = %d /n",n,nGlobalVar);
n = tempFunction(1,2);
printf("n = %d",n);
return 0;
}
CmakeLists.txt
project(gdbtest)
cmake_minimum_required(VERSION 2.8)
add_compile_options(-std=c++11 -g)
aux_source_directory(. SRC_LIST)
add_executable(${PROJECT_NAME} ${SRC_LIST})
编译后,在生成的可执行文件夹下输入gdb,进入调试模式
使用“file”命令载入被调试程序
file gdbtest
输出为Reading symbols from gdbtest…done.
表示在 main 函数开头设置一个断点(Breakpoint)
b+行在某行设置一个断点
如b 17
在17行设置断点
使用“r”命令执行(Run)被调试文件
程序停在17行
输出变量名的值p+变量名
p nGlobalVar
输出为
$1 = 88
如使用b tempFunction
在tempFunction函数开头设置一个断点
使用“c”命令继续(Continue)执行被调试程序,程序将停在第二个断点tempFunction的开头,再次输入c,函数结束输出
Inferior 1 (process 14695) exited normally
参考https://blog.csdn.net/makenothing/article/details/9531247
就是修改下面配置
sudo gedit /etc/sysctl.d/10-ptrace.conf
中的 kernel.yama.ptrace_scope = 1
为 kernel.yama.ptrace_scope = 0
(1)设置断点
就在行旁边单击就行
(2)查看变量的值
F5进入debug后鼠标放在值上面就会显示
(3)执行下一行
按F10
(4)继续,会跳到下一个断点
也是F5
(5)使用窗口查看变量或者数组的值
点Window->Views->Locals and Expressions
或者直接点下面的Views,选择Locals and Expressions
在下面输入变量或者数组的名称
如图