本文转载自微信公众号《程序喵大师》,作者程序喵大师。转载本文请联系程序大师喵公众号。相信大家都对如何调试代码很感兴趣。我也很感兴趣,但老实说我不知道??任何高端调试技巧。下面介绍一下我常用的代码调试方法。如果你有更好的调试方法,欢迎在留言区留言,不要私信。如何定位崩溃问题?关于crash的问题,我一般都是先看crash的报错,再查看堆栈信息。基本上70%的崩溃问题都可以通过查看堆栈信息来定位。其余的我通常使用日志或调试工具。一起看。有时崩溃不会稳定地出现在某个地方。这种调试比较麻烦。一般是某块内存有问题。例如,一个对象实际上是在地址0x123456构造的,但是我们使用地址0x234567来调用对象上的相关函数会导致崩溃,但不一定每次都在同一个地方。这就需要分段排查,缩小复发范围,然后使用调试工具或者日志打印某些变量的地址和变量值等,排查问题。也可以通过解决核心来解决问题。我一般用gdb来解决core。一些大佬可以很专业很高端的解决核心。..我主要是做移动原生开发,平时的项目基本不需要解决核心。而且现在经常用XCode调试,真的很方便。如何调试逻辑问题?对于逻辑问题,我一般都是打log,建议大家平时开发过程中一些关键的地方打log。开发过程中可能会比较麻烦,但是如果出现逻辑问题,而且不是稳定的复现,又没有相应的日志信息,那真的是挺麻烦的。所以老手们,多打log,别觉得麻烦,关键时刻log能发挥很大的作用。当然逻辑问题也可以通过gdb或者lldb断点调试,在一些关键的地方设置断点,然后查看一些变量的值,或者使用一些IDE进行调试。我通常使用XCode来断点调试。但是这种方法有一个缺点。如果程序发布后出现逻辑问题,调试起来会比较麻烦,所以建议多打印日志。如何调试内存问题?最常见的内存问题是内存泄漏。关于内存泄漏,我一般都是自己写一个内存检测的小工具,在项目中使用。对于C语言,使用宏覆盖malloc和free函数。C++如果是,则重写operatornew和operatordelete函数。在这里你可以阅读我之前写的文章。我用了一个内存泄漏检测工具,只用了两招。关于内存问题,推荐两个重度调试工具,valgrind和asan,valgrind想必大家都知道,用过。其实你也可以用asanmore。它是gcc自带的工具。很方便。关于asan,可以看我的文章HowtodebugmemoryleaksinLinuxHowtodebugdeadlockproblems?如果你合理地使用C++11的RAII风格的锁或更现代的std::scope_lock,几乎不会发生死锁。但是如果确实发生了死锁,如何调试呢?可以用IDE直接查看当前各个线程的堆栈信息,看看是哪两个线程处于等待状态,也就是说这两个线程基本都死锁了。你也可以使用gdb+deadlock.py。deadlock.py是检测死锁的python脚本,可以在gdb中执行。如果真的发生了死锁,直接执行脚本就可以检测到。代码太长就不贴出来了,deadlock.py的代码和用法可以在后台回复deadlock获取。如何进行性能分析?关于性能分析,其实我更喜欢打印代码中的耗时函数。至于如何优雅的打印耗时函数,可以移步这里计算RAII魔法的耗时函数。然后推荐一个性能分析工具,gperftools,这个工具是google出品的,可以提供整个程序的热点分布图,方便我们发现性能瓶颈。如何写出靠谱的代码?要想写出好的代码,就要做好静态检测。它可以帮助我们检测代码中潜在的缺陷,根据一定的设定代码规则,发现代码中隐藏的错误,比如参数不正确。匹配、歧义嵌套语句、错误递归、非法计算、空指针问题、越界问题、未初始化问题、内存泄漏等等。这里推荐一个工具Clang-Tidy,还有一个代码检测平台叫SonarCube,也很好用。详情可以看:这么多性能调优工具,你知道几个?如何登录?基本上,如果你想在C++中登录,你会用到日志库。有的大佬自己用,有的用第三方库。我工作的库中用的比较多的是glog,glog很好用,但是性能比较低。这里,推荐使用spdlog。spdlog基本上是现代C++中最流行的第三方日志库。功能齐全,性能高,值得推荐。怎么调试网络就不用说了,tcpdump+wireshark。如何进行单元测试?不用说了,直接上gtest。这里强调一下,在写代码之前尽量写测试用例,在开始写代码之前想好如何测试。哦,是时候收工了。
