gdb 调试基础操作和在qtcreator中使用gdb调试

  最近使用多线程,老是出现未知错误,比如程序死锁,或者线程突然挂掉,由于是多线程编程,单纯使用cout找不到出错点,只有学好gdb调试才能解决问题.

首先参考https://blog.csdn.net/liigo/article/details/582231

1.gdb调试基础操作

学习的知识点为新建Debug工程,进入gdb调试,加载调试程序,设置断点,查看变量名,单步调试,继续,结束

(1)新建Debug工程

新建工程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})

(2)进入gdb调试

编译后,在生成的可执行文件夹下输入gdb,进入调试模式

(3)载入被调试程序

使用“file”命令载入被调试程序
file gdbtest
输出为Reading symbols from gdbtest…done.
表示在 main 函数开头设置一个断点(Breakpoint)

(4)b+行设置一个断点

b+行在某行设置一个断点
b 17 在17行设置断点

(5)运行调试文件

使用“r”命令执行(Run)被调试文件
程序停在17行

(6)输出变量名

输出变量名的值p+变量名

p nGlobalVar 

输出为
$1 = 88

(7)使用 b+函数名在 函数开头设置一个断点

如使用b tempFunction在tempFunction函数开头设置一个断点

(8)使用s执行下一行代码

(9)继续

使用“c”命令继续(Continue)执行被调试程序,程序将停在第二个断点tempFunction的开头,再次输入c,函数结束输出
Inferior 1 (process 14695) exited normally

(10)q退出gdb

整个实验输出如图
gdb 调试基础操作和在qtcreator中使用gdb调试_第1张图片

2.qtcreator中使用gdb调试

2.1首先解决错误 qt调试 ptrace:不允许的操作

参考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

2.qtcreator debug基本操作

(1)设置断点
就在行旁边单击就行
(2)查看变量的值
F5进入debug后鼠标放在值上面就会显示
(3)执行下一行
按F10
(4)继续,会跳到下一个断点
也是F5
(5)使用窗口查看变量或者数组的值
点Window->Views->Locals and Expressions
或者直接点下面的Views,选择Locals and Expressions
在下面输入变量或者数组的名称
如图
gdb 调试基础操作和在qtcreator中使用gdb调试_第2张图片

你可能感兴趣的:(学习linux)