美文网首页
调试杂谈

调试杂谈

作者: 要厉害的 | 来源:发表于2019-06-07 15:50 被阅读0次

    一些工作中用到的调试基础,主要和C++相关。

    1、gdb类似的调试器可以跟踪编译好的程序,但是在编译时把调试信息包含进来才能发挥它最大的作用;

    2、gdb中出现“??”则它和源代码没有办法对应起来。以下划线开头的是内部instance。

    3、在调试中striped和not stripped代表链接阶段的变量名称和符号是否被移除。调试阶段的信息在发布时最好删除,这时候strip命令即可以派上用场。

    调试版本和发行版本存在着差异,两个版本针对场景不同,择优使用。

    4、Linux编译的时候使用“-g”可以加入调试信息。Windows可以构建发行版或者调试版区别调试信息是否被包含。

    5、编译器有些情况下会优化代码,这时候需要关闭这些优化级别。否则,代码和调试信息可能存在无法对应的情况。Linux下面是O0,Windows的IED根据版本情况自动控制,而Java编译器不会优化,而是在JIT(just in time)Java代码运行时,将JVM代码翻译成机器码的阶段来执行优化。

    6、想获得高的代码执行效率关闭调试信息,开启优化。不想被逆向关闭调试信息。

    GDB的调试基础很简单,断点、单步调试、查看变量是否符合预期,解决问题的关键还是在对问题的分析能力和计算机基础上。除此之外,需要熟练各种基础命令,提升效率。

    7、循环执行了错误的次数,判断走入和预期不符合的分支。

    8、gdb中实在找不到调查的代码位置先打一个“b main”

    9、巧用“step over”跳过没必要关注的函数循环

    10、需要检查的“step in”,也可以用gdb中的“finish”从中返回。

    11、断点应当在问题的附近多打一些。

    12、run和continue的区别,“run”从头执行,而“continue”继续执行。

    13、watch可以跟踪变量在读写时触发,“awatch”跟踪读写,“watch”跟踪写,“rwatch”跟踪读。

    14、“info b”展示已经设置的断点,用“disable id”将对应的断点/监视变量删除。

    反向调试功能很强大,但是并不普及

    15、先用display设置想要观察的值,在观察区域的结束部分设置断点,然后执行“record”开启记录,再执行“cont”将程序执行到断点处。查看之前的执行语句“reverse-next”,“reverse-continue”将反向执行至上一个断点(实际上有距离限制需在20w条指令之内)。

    连接正在运行的程序

    16、使用命令gdb -p <process id>

    strace命令

    17、strace跟踪系统调用,注意它的粒度是系统级别的。比如ls命令看到的就是getdents、stat等。

    相关文章

      网友评论

          本文标题:调试杂谈

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