美文网首页
cmake 多进程debug

cmake 多进程debug

作者: 东京的雨不会淋湿首尔 | 来源:发表于2020-01-15 15:12 被阅读0次

    1. 在CMakeLists.txt文件中添加如下语句:

    SET(CMAKE_BUILD_TYPE "Debug")
    SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")
    SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

    2. 编译

    cmake Path // path 是CMakeLists.txt 所在路径

    编译后得到make文件

    make -j2 //2个core编译

    3. 使用gdb运行可执行程序

    gdb ./xxx.out

    4. 正常的话进入了gdb console

    • 配置运行参数:set args xxx
      eg: set args -c /path1/path2

    • 监控子线程: set follow-fork-mode childset auto-load safe-path / set detach-on-fork off

    5. 设置断点

    b hello.c:15 // 给hello.c的15 行上断点

    多个源文件时指定breakpoint的位置:
    如果有多层目录,则在gdb中,用dir命令把你所想加入的文件的目录指定出来,然后b 命令就可以用了。
    就是类似这样的:
    dir ../app(相对路径,绝对路径都行)

    6.运行

    r //就是run

    • n是next,s是step
    • p是print 查看某个变量x ----> p x
    • gdb看变量是哪个数据类型 (gdb) whatis i

    gdb打印表达式的值:print/f 表达式
    f是输出的格式,x/d/u/o/t/a/c/f
    表达式可以是当前程序的const常量,变量,函数等内容,但是GDB不能使用程序中所定义的宏
    查看当前程序栈的内容: x/10x $sp-->打印stack的前10个元素
    查看当前程序栈的信息: info frame----list general info about the frame
    查看当前程序栈的参数: info args---lists arguments to the function
    查看当前程序栈的局部变量: info locals---list variables stored in the frame
    查看当前寄存器的值:info registers(不包括浮点寄存器) info all-registers(包括浮点寄存器)
    查看当前栈帧中的异常处理器:info catch(exception handlers)
    d 按十进制格式显示变量 x 按十六进制格式显示变量 a 按十六进制格式显示变量 u 按十六进制格式显示无符号整型 o 按八进制格式显示变量 t 按二进制格式显示变量 c 按字符格式显示变量 f 按浮点数格式显示变量

    Cannot insert breakpoint 1.
    删除所有断点delete


    转自http://blog.chinaunix.net/uid-20760757-id-1872358.html
    主要内容是介绍一些在程序调试过程中最常用的GDB命令,废话不多话,开始今天的正题。

    1.attach process-id/detach

    (1)attach process-id: 在GDB状态下,开始调试一个正在运行的进程,其进程ID为process-id
    (2)detach: 停止调试当前正在调试有进程,与attach配对试用

    2.kill

    (1)基本功能:杀掉当前GDB正在调试的应用程序所对应的子进程
    (2)如果想不退出GDB而对当前正在调试的应用程序重新编译、链接,可以在GDB中执行kill杀掉子进程,等编译、链接完后,再重新执行run,GDB便可加载新的可执行程序启动调试

    3.多线程程序调试相关:

    (1)thread threadno:切换当前线程到由threadno指定的线程
    (2)info threads:查看GDB当前调试的程序的各个线程的相关信息
    (3)thread apply [threadno] [all] args:对指定(或所有)的线程执行由args指定的命令

    4.多进程程序调试相关(fork/vfork):

    (1)缺省方式:fork/vfork之后,GDB仍然调试父进程,与子进程不相关
    (2)set follow-fork-mode mode:设置GDB行为,mode为parent时,与缺省情况一样;mode为child时,fork/vfork之后,GDB进入子进程调试,与父进程不再相关
    (3)show follow-fork-mode:查看当前GDB多进程跟踪模式的设置

    5.step & stepi

    (1)step [count]: 如果没有指定count, 则继续执行程序,直到到达与当前源文件不同的源文件中时停止;如果指定了count, 则重复行上面的过程count次
    (2)stepi [count]: 如果没有指定count, 继续执行下一条机器指令,然后停止;如果指定了count,则重复上面的过程count次
    (3)step比较常见的应用场景:在函数func被调用的某行代码处设置断点,等程序在断点处停下来后,可以用step命令进入该函数的实现中,但前提是该函数编译的时候把调试信息也编译进去了,负责step会跳过该函数。

    6.next & nexti

    (1)next [count]: 如果没有指定count, 单步执行下一行程序;如果指定了count,单步执行接下来的count行程序
    (2)nexti [count]: 如果没有指定count, 单步执行下一条指令;如果指定了count, 音频执行接下来的count条执行
    (3)stepi和nexti的区别:nexti在执行某机器指令时,如果该指令是函数调用,那么程序执行直到该函数调用结束时才停止。

    7.continue [ignore-count]

    唤醒程序,继续运行,至到遇到下一个断点,或者程序结束。如果指定ignore-count,那么程序在接下来的运行中,忽略ignore-count次断点。

    8. finish & return

    (1)finish: 继续执行程序,直到当前被调用的函数结束,如果该函数有返回值,把返回值也打印到控制台
    (2)return [expression]: 中止当前函数的调用,如果指定了expression,把expresson值当做当前函数的返回值;如果没有,直接结束当前函数调用

    9.信号的处理

    (1)info signals & info handle:打印所有的信号相关的信息,以及GDB缺省的处理方式:
    (2)handle signal action: 设置GDB对具体某个信号的处理方式。signal可以为信号整数值,也可以为SIGSEGV这样的符号。action的取值有:
    a. stop和nostop: nostop表示当GDB收到指定的信号,不会应用停止程序的执行,只会打印出一条收到信号的消息,因此,nostop也暗含了下面的print; 而stop则表示,当GDB收到指定的信号,停止应用程序的执行。
    b. print和noprint: print表示如果收到指定的信号,打印出一条信息; noprint与print表示相反的意思
    c. pass和nopass:pass表示如果收到指定的信号,把该信号通知给应用程序; nopass表示与pass相反的意思
    d. ignore和noignore: ignore与nopass同义,同理,noignore与pass同义

    相关文章

      网友评论

          本文标题:cmake 多进程debug

          本文链接:https://www.haomeiwen.com/subject/ivstzctx.html