1.å¦ä½ç¨C++ builderè°è¯ç¨åº
2.Java开发遇到bug不要怕,调调试手把手教你debug!试源
3.如何在浏览器中进行js调试?工具
4.cè¯è¨å¦ä½è°è¯
5.我找到了Dubbo源码的BUG,同事纷纷说我有点东西
6.在 IDEA 中的调调试各种调试技巧,轻松定位 Bug
å¦ä½ç¨C++ builderè°è¯ç¨åº
1ãå¨ä»£ç åç¨é¼ æ å·¦é®ç¹ä¸ä¸ä¼åºç°ä¸ä¸ªçº¢ç¹ï¼å«åæç¹ï¼ï¼è¿æ ·åè¿è¡ç¨åºæ¶ï¼ç¨åºè¿è¡å°è®¾ç½®å°æç¹å¤ä¼åä¸æ¥ï¼æf8å¯ä»¥ä¸å¥ä»£ç ä¸å¥ä»£ç çè¿è¡ï¼å¹¶ä¸æé¼ æ æå°ä½ å®ä¹çåéä¸å¯ä»¥çå°å½å该åéçæ°å¼ãå¨ä»£ç ååç¨é¼ æ å·¦é®ç¹ä¸ä¸å¯ä»¥åæ¶æç¹
2ãè¦çæ°å¼ï¼ä¸è¬æ¯å¨çªä½ä¸æ·»å ä¸ä¸ªâæé®âæ§é®ï¼ç¶ååå»è¯¥æé®å¯ä»¥è¿å ¥è¯¥æé®ååºçå½æ°ï¼å¨å½æ°å 添家代ç ShowMessage(str);å ¶ä¸stræ¯åç¬¦ä¸²æ ¼å¼ï¼è¿æ ·ç¨åºè¿è¡æ¶åå»è¯¥æé®å°±å¯ä»¥æ¾ç¤ºstrçå 容
ï¼å¦æè¦æ¾ç¤ºintåå¯ä»¥ç¨ShowMessage(IntToStr(str));)
Java开发遇到bug不要怕,试源手把手教你debug!工具柏林函数源码
我们先来看下面这段代码?你觉得会有什么问题吗?
上面代码的调调试运行结果如下图所示,与你预想的试源结果一样吗?
很明显,上面的工具代码有问题!那该怎么解决呢?我们可以使用debug功能来进行调试。调调试
1. Debug模式
debug是试源供程序员使用的程序调试工具,它可以用域查看程序的工具执行流程,也可以用域追踪程序执行过程来调试程序。调调试
2. debug调试面板介绍
接下来我就给大家解释一下debug调试面板的试源功能:
①==>重新运行程序,会关闭服务后重新启动程序; ②==>更新程序,工具一般在你的代码有改动后可执行这个功能; ③==> 关闭程序; ④==> 查看所有的断点; ⑤==> 哑的断点,选择这个后,所有断点变为灰色,断点失效; ⑥==> 步过,一行一行地往下走,如果这一行上有方法不会进入方法; ⑦==>步入,如果当前行有方法,树莓派aosp源码可以进入方法内部,一般用于进入自定义方法内,不会进入官方类库的方法; ⑧==>强制步入,能进入任何方法,查看底层源码的时候可以用这个进入官方类库的方法; ⑨==>步出,从步入的方法内退出到方法调用处,此时方法已执行完毕,只是还没有完成赋值; ⑩==>行到光标处,你可以将光标定位到你需要查看的那一行,然后使用这个功能,代码会运行至光标行,而不需要打断点。
3. Debug调试步骤
了解了这些基本的功能之后,我们再来看看debug的调试步骤:
3.1 如何加断点
选择要设置断点的代码行,在行号的区域后面单击鼠标左键即可。
3.2 运行加了断点的程序
在代码区域直接右键Debug执行。
3.3 如何查看调试结果
我们可以通过查看Debugger窗口和Console窗口来查看调试结果。
3.4 解决问题
通过观察程序的执行以及变量值的改变,可以发现循环变量没有发生改变 ,所有使用debug很快就可以查找到错误。
3.5 解决后的源码资本基金报告代码
现在我们就把debug模式的使用给大家介绍完了,最后总结如下:
A. 条件断点:在有逻辑条件判断处设置断点 例如:多分支if swicth...; B. 变量断点:在关键的变量上设置断点 观察变量的值的变化; C. 方法断点:在方法的入口处设置断点 可以观察方法的执行的结果以及流程; D. 异常断点:就是在发生异常的地方设置断点 确定异常发生的情况。
现在你学会怎么使用debug了吗?可以在评论区留言,说出你的问题,我来给你解决。
如何在浏览器中进行js调试?
如何在浏览器中进行js调试?
在生产环境中遇到线上bug无法复现时,需要在浏览器中进行js调试。在测试环境调试代码不靠谱,因此需要快速找出问题原因,避免直接改动线上代码。生产环境代码通常关闭了source map和经过混淆,接下来介绍如何在这些情况下进行调试。
一种方法是通过console找到源代码打断点。在浏览器控制台的console面板,找到由bug导致的报错信息或日志,点击文件名称跳转到源码位置,直接在代码中设置断点进行调试。
若点击文件名后出现错误,可以调整浏览器控制台设置,取消勾选“Enable JavaScript source maps”,重新点击文件名即可。此方法简便易行,集卡网站源码但无法处理没有报错信息或难以在代码中插入log的情况。
另一种方法是利用network面板的Initiator找到源代码。将鼠标移至请求的Initiator,查看调用链中的方法和函数,找到离bug最近的接口请求,从而定位到所需方法或函数。混淆代码中函数和变量名称改变,但对象中的方法和属性名称保持不变。通过识别调用栈中的对象方法名称,可以快速定位源代码。
以一个例子说明,假设有一个service/common.js文件被业务组件调用。在Initiator调用栈中找到对应的getMessageList方法,并确定initData调用了该方法。在调用栈中,getMessageList方法之上即为源代码位置,点击文件名称即可跳转。
如果源代码被压缩,点击左下角的花括号恢复代码格式,对比混淆前后的代码,通常差异不大,抖音弹幕源码便于进行调试。
另一种情况是bug位置没有接口请求。通过Initiator找到对应的源代码js文件,搜索已知的属性和方法名称,因为这些名称在混淆过程中不会改变,同样能定位到源代码。
总结:本文介绍了两种在线上进行js调试的方法。通过console找到源代码打断点或利用network面板的Initiator,快速定位和解决线上bug。希望本文能帮助您更有效地进行浏览器中的js调试。
cè¯è¨å¦ä½è°è¯
ç®åæ¥è¯´ï¼æ两ç§æ¹å¼:ä¸ç§æ¯æºç debugï¼å³åææºç æ¥æ¾åºbugä½ç½®ï¼ä¸è¬ä½¿ç¨printf()æå°åºç¨åºæ§è¡æ¯ä¸æ¥çä¿¡æ¯;
ä¸ç§æ¯å¯æ§è¡æ件debugï¼éè¦ä½¿ç¨è°è¯å¨æ¥è¿è¡ã
1ãæºç debug
类似äºä¸é¢çæºç ï¼ä¸»è¦éè¿ç¨åºæ§è¡æ¶è¾åºçä¿¡æ¯ï¼æ¥å®ä½bugåºç°çä½ç½®ï¼ç¶ååä¿®æ¹æºç ã
#include <stdio.h>
void f() { ; }
int main()
{
#ifdef _DEBUG
printf("start main function!\n");
#endif
void f();
#ifdef _DEBUG
printf("leave main function !\n");
#endif
return 0;
}
2ãå¯æ§è¡æ件è°è¯ï¼windowså¹³å°å¸¸ç¨çå°±æ¯vs/vcèªå¸¦çè°è¯ï¼å¦å¤ä¸ä¸ªå°±æ¯å¾®è½¯èªå®¶å¼åçè°è¯å¨windbgãLinuxå¹³å°ä»¥gdb为常ç¨ã
IDEèªå¸¦çè°è¯å¨ä»¥VC6.0为ä¾ï¼ç¼åå®ä»£ç åï¼æå¿«æªé®çFï¼å³å¯è¿å ¥è°è¯ï¼æ¤æ¶å³é®ï¼éæ©âgo to disassembly"å³å¯æ¥çå°ç¨åºçåæ±ç¼ä»£ç ãä¸è¬è¿ç§æ åµï¼ä¸»è¦æ¯ä¸ºäºå¯¹Cè¯è¨è¿è¡åæ±ç¼å¦ä¹ ã
Windbgçåè½é常å¤ï¼å¯ä»¥è¿è¡æºç è°è¯ãå¯ä»¥è°è¯å¯æ§è¡æ件ãè¿å¯ä»¥è¿è¡å æ ¸è°è¯ï¼ä¹å¯ä»¥è°è¯dumpæ件ï¼ç¨çå¤äºï¼èªç¶çæï¼è¦è°è¯å¯æ§è¡æ件ï¼åªéè¦ç¹å»âFile"å¨å¼¹åºç对è¯æ¡ä¸éæ©âOpen Executeable"ï¼ç¶åæ¾å°èªå·±è¦è°è¯çç¨åºå³å¯ã
Linux常ç¨çæ¯Gdbè°è¯å¨ï¼å¼å¾æ³¨æçæ¯ï¼è¦ä½¿ç¨gdbè°è¯ï¼å¨ä½¿ç¨gccæè g++ç¼è¯C/c++æ件æ¶ï¼éè¦æ·»å -gåæ°æå¯ä»¥çæ符å·è¡¨ãä¸å¾æ¯ç¨gdbåæC++ä¸åéåå¸çä¸å¼ æªå¾ï¼å¤§ä½ä¸çä¸ä¸é¿ä»ä¹æ ·ï¼ç¨çå¤äºèªç¶çæï¼ä¸éè¦å¯ä»¥å»å¦ä¹ ã
我找到了Dubbo源码的BUG,同事纷纷说我有点东西
某天,运营反馈称,执行一次保存操作后,后台出现3条数据,我立刻怀疑可能存在代码问题。为了确保不会误判,我要求暂停操作,保留现场,以便我进行排查。
查看新增代码,发现是同事三歪进行的改动,他将原有的dubbo XML配置方式改为了注解方式。我询问其改动详情,得知他是更改了模块的配置方式。于是,我决定深入研究,找出问题所在。
dubbo配置方式多样,最常见的为XML配置与注解配置。我已初步推测原因,接下来将进行详细的调试过程。
我使用dubbo版本2.6.2进行调试。首先,针对采用@Reference注解条件下的重试次数配置,我发现调用接口时,会跳转到InvokerInvocationHandler的invoke方法。继续跟踪,最终定位到FailoverClusterInvoker的doInvoke方法。在该方法中,我关注到获取配置的retries值,发现其默认值为null,导致最终计算出的重试次数为3。
采用dubbo:reference标签配置重试次数时,同样在获取属性值后,发现其默认值为0,与注解配置一致,最终计算出的重试次数为1。对比两种配置方式,我总结了以下原因:
在@Reference注解形式下,dubbo会在注入代理对象时,通过自定义驱动器ReferenceAnnotationBeanPostProcessor来注入属性。在标签形式下,虽然也使用了Autowired注解,但dubbo会使用自定义名称空间解析器DubboNamespaceHandler进行解析。
在注解形式下,当配置retries为0时,属性值在注入过程中并未被解析为null,但进入buildReferenceBean时,因nullSafeEquals方法的处理,导致默认值和实际值不一致,最终未保存到map中。而标签形式下,解析器能够正确解析出retries的值为0,避免了后续的问题。
总结发现,采用@Reference注解配置重试次数时,dubbo在注入属性过程中存在逻辑处理上的问题,导致默认值与实际值不一致。此为dubbo的一个逻辑bug。建议在不需要重试时,设置retries为-1,以确保接口的幂等性。需要重试时,设置为1或更大值。
问题解决后,我优化了文件操作,将其改为异步处理,从而缩短了主流程的时间。最终,数据出现3条的状况得以解决。
此问题已得到解决,并在后续dubbo版本2.7.3中修复,确保了在注解配置方式下,nullSafeEquals方法能够正确处理默认值与实际值一致的情况。
在 IDEA 中的各种调试技巧,轻松定位 Bug
在软件开发中,IDEA的Debug功能是查找和修复Bug的重要工具。它能帮助我们跟踪代码执行路径,分析异常位置和参数变化,甚至深入学习第三方框架。以下是在IntelliJ IDEA中使用Debug技巧的详细指南:
首先,理解IDEA Debug模式的基本界面,包括设置自动显示调试窗口、查看工具栏和快捷键。然后,掌握基础用法,如使用Show Execution Point (Alt + F)跳转到当前执行点,Step Over (F8)和Step Into (F7)控制代码执行流程,以及Force Step Into (Alt + Shift + F7)用于查看底层源码。
在调试过程中,查看变量变化是关键,IDEA提供了多种查看方式,如代码行后显示值、光标悬停时查看详情、Variables面板和Watches来监控特定变量。同时,计算表达式功能(Alt + F8)能够直接计算表达式值,省去打印信息的步骤。
智能步入功能(Smart Step Into, Shift + F7)则帮助我们在复杂方法调用中选择性进入,而断点条件设置允许只在满足条件时暂停执行。此外,多线程调试和异常断点的使用也相当重要,可以更好地控制程序流程。
最后,对于JRebel这类热部署工具的使用,虽然有时需要重启服务,但能极大提高开发效率。关于JRebel的激活方法,本文未详述,但提供了一种非破解的获取永久使用权的方式,但需注意其可用性可能随时间变化。