1.JS代码调试映射工具——Source Maps简介
2.如何调试跟踪AndroidFramework源代码
3.å¦ä½å¨ASP.NET Core 6ä¸ä½¿ç¨è·è¸ªçå¬å¨
4.Android Activity Deeplink启动来源获取源码分析
5.Messier - 简单易用的何跟Objective-C方法跟踪工具
JS代码调试映射工具——Source Maps简介
在JavaScript开发中,Source Maps扮演着至关重要的踪源角色,特别在利用Babel等工具处理ES6+代码转换为ES5的码何过程中。简单来说,跟踪Source Maps是源码一种技术,它能够将经过转换的信息源码交易贷款保单代码准确地映射回原始的源代码,从而实现更为直观的何跟调试和错误追踪。
其工作原理是踪源通过在构建过程中生成额外的映射文件,该文件包含了转换前后代码之间的码何对应关系。这种映射信息使得开发者能够在出现错误时,跟踪直接在原始源代码中定位问题,源码而无需查看复杂的信息转换后代码。
在实际操作中,何跟开发工具通常会自动或通过配置生成Source Maps。踪源这不仅提升了调试效率,码何还便于版本控制和部署,因为开发者可以跟踪代码从源到编译后的变化过程。
然而,使用Source Maps并非没有代价。王者战狼源码它可能增加文件大小,影响性能,并需要考虑安全因素,比如防止恶意代码利用Source Maps进行攻击。因此,开发者在集成和使用时需要根据项目的具体需求,权衡性能和文件管理,确保其在开发环境中的有效性和安全性。
总的来说,Source Maps作为现代JavaScript开发中的关键组件,通过其集成性和灵活性,极大地提升了开发者的工作效率,使得代码的调试和管理变得更加直观和高效。
如何调试跟踪AndroidFramework源代码
为了在Eclipse中调试跟踪Android Framework的源代码,需要遵循一系列步骤。以下内容改写并优化了原文的条理和质量,确保语义不变,并保留了原文的uni小游戏源码条目编号。
1. **环境配置**:
- 确保安装了JDK、Eclipse、Android SDK和ADT插件。
- 针对跟踪调试Android源码,需要有可访问的Android源码编译环境,可以是虚拟机、网络共享或Linux本地环境。
- 确保Android源码是编译过的Eng版本。
2. **基本设置**:
- 将Android源码路径下的`.classpath`文件复制到源码根目录。
- 修改Eclipse的`eclipse.ini`文件以增加Java堆大小。
3. **创建工程**:
- 在Eclipse中创建一个新的Java项目。
- 输入项目名称,选择Android源码路径作为项目位置。
- 完成创建,并注意排除或添加项目中错误的配置包。
4. **调试环境配置**:
- 在Eclipse中设置远程Java应用程序的调试配置。
- 填写名称、项目选择为Android源码项目、卖家主图源码端口填写正确的端口号。
- 应用并保存配置。
5. **调试过程**:
- 启动模拟器或连接真机,确保设备在DDMS视图中可见。
- 在目标代码处设置断点。
- 在设备上触发调试进程(如锁屏解锁操作)。
- 使用Eclipse的调试工具来控制程序执行和查看变量值。
6. **错误处理**:
- 如果导入的工程出现错误,可以通过以下方式处理:
- 方法一:编译自己的SDK,替换默认SDK中的`android.jar`。
- 方法二:将编译后的`framework`的`classes.jar`文件添加到Eclipse工程的`build path`中。
7. **注意事项**:
- 本文档适用于Windows、Mac OS和Linux系统。
- 可以调试Java代码,但不能调试Framework中的C/C++代码。
- 确保Android源码已编译,并且是Eng模式。
- 调试前需在目标代码处设置断点,榜单系统源码并知道其执行的进程。
通过这些步骤,开发者可以在Eclipse中有效地调试Android Framework的源代码。
å¦ä½å¨ASP.NET Core 6ä¸ä½¿ç¨è·è¸ªçå¬å¨
å½ä½¿ç¨ASP.NET Core 6æ建çåºç¨ç¨åºæ¶ï¼ä½ å¯è½ç»å¸¸æ³ä½¿ç¨è·è¸ªåè®°å½æ¥çæ§ä½ çåºç¨ç¨åºçæ§è½åè¯æé误ãä½ ä¹å¯ä»¥å¨ç产ç¯å¢ä¸ä½¿ç¨è·è¸ªæ¥è¡¡éä½ çåºç¨ç¨åºå¨è¿è¡æ¶ç表ç°ãè¿ç¯æç« è®¨è®ºäºæ们å¦ä½å¨ASP.NET Core 6ä¸ä½¿ç¨è¿½è¸ªãæ们å°ç 究å¦ä½ä½¿ç¨è·è¸ªçå¬å¨æ¥æ¶éè·è¸ªä¿¡æ¯ï¼å¹¶ä½¿ç¨ILoggerå°è·è¸ªè¾åºå¼å¯¼å°äºä»¶æ¥å¿ä¸ã
è¦ä½¿ç¨æ¬ææä¾ç代ç 示ä¾ï¼ä½ çç³»ç»ä¸åºè¯¥å®è£ æVisual Studio ãå¦æä½ è¿æ²¡æå¯æ¬ï¼ä½ å¯ä»¥å¨è¿éä¸è½½Visual Studio ã
å¨Visual Studio ä¸å建ä¸ä¸ªASP.NET Core Web API项ç®é¦å ï¼è®©æ们å¨Visual Studio ä¸å建ä¸ä¸ªASP.NET Core项ç®ãæç §è¿äºæ¥éª¤å°å¨Visual Studio ä¸å建ä¸ä¸ªæ°çASP.NET Core 6 Web API项ç®ã
å¯å¨Visual Studio IDEã
ç¹å» "å建æ°é¡¹ç®"ã
å¨ "å建æ°é¡¹ç® "çªå£ï¼ä»æ¾ç¤ºç模æ¿å表ä¸éæ© "ASP.NET Core Web API"ã
ç¹å» "ä¸ä¸æ¥"ã
å¨ "é ç½®ä½ çæ°é¡¹ç® "çªå£ä¸ï¼æå®æ°é¡¹ç®çå称åä½ç½®ã
æ ¹æ®ä½ çå好ï¼å¯ä»¥éæ©å¾é "å°è§£å³æ¹æ¡å项ç®æ¾å¨åä¸ç®å½ä¸ "å¤éæ¡ã
ç¹å» "ä¸ä¸æ¥"ã
å¨æ¥ä¸æ¥æ¾ç¤ºç "éå ä¿¡æ¯ "çªå£ä¸ï¼ç¡®ä¿å¾é "使ç¨æ§å¶å¨... "çå¤éæ¡ï¼å 为æ们å¨è¿ä¸ªä¾åä¸ä¸ä¼ä½¿ç¨æå°çAPIãå° "éªè¯ç±»å "ä¿ç为 "æ "ï¼é»è®¤ï¼ã
ç¡®ä¿ "å¯ç¨Docker"ã"为HTTPSé ç½® "å "å¯ç¨å¼æ¾APIæ¯æ "çå¤éæ¡ä¸è¢«éä¸ï¼å 为æ们ä¸ä¼å¨è¿é使ç¨ä»»ä½è¿äºåè½ã
ç¹å»å建ã
æ们å°ä½¿ç¨è¿ä¸ªASP.NET Core 6 Web API项ç®ï¼å¨æ¬æçåç»é¨å使ç¨è·è¸ªçå¬å¨ã
ä»ä¹æ¯è·è¸ªï¼ä¸è¿½è¸ªä¸»è¦äºä»¶çäºä»¶æ¥å¿ç¸æ¯ï¼è¿½è¸ªå¯ä»¥æ´å ¨é¢å°äºè§£è¿è¡ä¸çåºç¨ç¨åºåå ¶ç»ä»¶ãæ¥å¿ç±ç»æåæéç»æåçæ¶é´æ³æ°æ®ç»æï¼æ¾ç¤ºäºä½ çåºç¨ç¨åºä¸åççäºä»¶çè®°å½ã追踪æä¾äºå¯¹å个请æ±ä»¥åå®å¦ä½è¢«å¤ççæ´å¤å¯è§æ§ã
System.Diagnosticså½å空é´å å«TraceåDebugç±»ãè·è¸ªç±»å¨ç产ç¯å¢ä¸ä½¿ç¨ï¼èè°è¯ç±»å¨å¼åæ¶ä½¿ç¨ã
追踪é常å æ¬ä»¥ä¸ä¸ä¸ªé¶æ®µã
å·¥å ·åãæ们ç¼åå¿ è¦ç代ç æ¥æè·ç¸å ³ä¿¡æ¯
追踪ãæ们æè·è¸ªä¿¡æ¯åå°æå®çç®æ ï¼å³äºä»¶æ¥å¿ãææ¬æ件ãæ°æ®åºè¡¨çã
åæãæ们åæä»è·è¸ªä¸æ¶éå°çä¿¡æ¯ï¼ä»¥ç¡®å®åºç¨ç¨åºä¸çç¶é¢ã
ä»ä¹æ¯è·è¸ªçå¬å¨ï¼ä¸ºä»ä¹éè¦å®ä»¬ï¼è·è¸ªçå¬å¨æ¶éè·è¸ªä¿¡æ¯ï¼åå¨å®ä»¬ï¼å¹¶å°å®ä»¬å¼å¯¼å°ä¸ä¸ªéå½çç®æ ï¼å¦ææ¬æ件ã.NETæä¾äºå ç§è·è¸ªçå¬å¨ï¼å æ¬ä»¥ä¸å ç§ã
ConsoleTraceListener - å°è·è¸ªä¿¡æ¯åéå°æ§å¶å°çªå£ã
DefaultTraceListener - å°è·è¸ªä¿¡æ¯åéå°æ åè°è¯è¾åºã
DelimitedListTraceListener - å°è·è¸ªè¾åºä»¥éå®çæ ¼å¼åéå°æµãæµä½å®¶æææ¬ä½å®¶ã
EventLogTraceListener - åéè·è¸ªä¿¡æ¯å°äºä»¶æ¥å¿ã
TextWriterTraceListener - åéè·è¸ªä¿¡æ¯å°ä¸ä¸ªææ¬æ件ã
XmlWriterTraceListener - å°è·è¸ªä¿¡æ¯è½¬æ¢ä¸ºXMLã
System.Diagnostics.DebugåSystem.Diagnostics.Traceç±»å¯ä»¥åè·è¸ªçå¬å¨åéæ¶æ¯ï¼èçå¬å¨åå°æ¶æ¯åéå°éå½çç®æ ã
å¨ASP.NET Core 6ä¸ä½¿ç¨é ç½®æ件å建ä¸ä¸ªè·è¸ªçå¬å¨ä½ å¯ä»¥éè¿ä½¿ç¨é ç½®æ件æç¼åèªå®ä¹ä»£ç æ¥å建ä¸ä¸ªè·è¸ªçå¬å¨ãä¸é¢æ¾ç¤ºç代ç çæ说æäºå¦ä½ä½¿ç¨ä½ çåºç¨ç¨åºé ç½®æ件å建ä¸ä¸ªè·è¸ªçå¬å¨ã
<configuration>æææ·»å å°çå¬å¨éåä¸ççå¬å¨é½ä¼æ¶å°è·è¸ªè¾åºãç¶èï¼ä½ å¯ä»¥ä½¿ç¨ä¸ä¸ªçå¬å¨èä¸æå®æ·»å å°çå¬å¨éåä¸ãå¨è¿ç§æ åµä¸ï¼ä½ å¨çå¬å¨ä¸ä½¿ç¨WriteæWriteLineæ¹æ³åéè¾åºã
ä¸é¢ç代ç 说æäºä¸ä¸ªçå¬å¨ï¼å®æ²¡æ被添å å°çå¬å¨éåä¸ï¼ä½ä»ç¶è½å¤å°è·è¸ªä¿¡æ¯åéå°è¾åºçªå£ãæ件æä»»ä½é¢å é ç½®çè¾åºã
TextWriterTraceListenermyFirstListener=newå¨ASP.NET Core 6ä¸å建ä¸ä¸ªèªå®ä¹è·è¸ªçå¬å¨å¨å¤§å¤æ°æ åµä¸ï¼.NET 6é»è®¤é带çè·è¸ªçå¬å¨å°æ»¡è¶³æ¨çè¦æ±ãç¶èï¼å¦æä½ æ³æä½ çè·è¸ªä¿¡æ¯è¾åºå°ä¸åçç®çå°ï¼ä½ å¯ä»¥å®ç°ä½ èªå·±çè·è¸ªçå¬å¨ã
è¦å»ºç«ä¸ä¸ªèªå®ä¹çè·è¸ªçå¬å¨ï¼ä½ åºè¯¥å建ä¸ä¸ªæ©å±TraceListeneræ½è±¡ç±»çç±»ãå¨TraceListenerç±»ä¸æå 个èæåæ½è±¡çæ¹æ³ãä½ è³å°åºè¯¥å®ç°WriteåWriteLineæ¹æ³ãè³å°ï¼ä½ çèªå®ä¹è·è¸ªçå¬å¨åºè¯¥çèµ·æ¥åè¿æ ·ã
publicclassCustomTraceListener:TraceListeneræ以ï¼ä½ çèªå®ä¹è·è¸ªçå¬å¨ç±»å¿ é¡»æä¸ä¸ªåæ°æé å¨åWriteåWriteLineæ¹æ³ã
ä½ è¿éè¦ä¸ä¸ªILoggerå®ä¾æ¥ä»£è¡¨è®°å½å¨ï¼ä¸ä¸ªè®°å½å¨å·¥åæ¥å建记å½å¨ï¼ä»¥åä¸ä¸ªStringBuilderæ¥åå¨è·è¸ªæ¶æ¯ï¼ç¶ååå°å®ä»¬åéå°æ¥å¿ç®æ ã
privatereadonlyILoggerFactory_loggerFactory;ä½ å¯ä»¥å©ç¨ä¾èµæ³¨å ¥çä¼å¿ï¼å¨æé å½æ°ä¸æ³¨å ¥ILoggerFactoryçä¸ä¸ªå®ä¾ï¼ç¶å使ç¨è¯¥å®ä¾æ¥å建ILoggerçä¸ä¸ªå®ä¾ã
publicCustomTraceListener(ILoggerFactoryloggerFactory)è¿éæ¯WriteåWriteLineæ¹æ³çä¸ä¸ªæå°å®ç°ã
publicoverridevoidWrite(string?message,string?category)ASP.NET Core 6ä¸å®æ´çèªå®ä¹è·è¸ªçå¬å¨ç¤ºä¾ä¸é¢æ¯æ们对èªå®ä¹è·è¸ªçå¬å¨çæå°å®ç°çå®æ´æºä»£ç ï¼ä¾æ¨åèã
usingSystem.Collections.Concurrent;å¨Program.csæ件ä¸æ³¨åèªå®ä¹è·è¸ªçå¬å¨è¦ä½¿ç¨èªå®ä¹è·è¸ªçå¬å¨ï¼ä½ åºè¯¥ä½¿ç¨ä»¥ä¸ä»£ç å¨çå¬å¨éåä¸æ³¨åå®ã
varloggerFactory=app.Services.GetRequiredService<ILoggerFactory>();å 为æ们çèªå®ä¹è·è¸ªçå¬å¨å·²ç»è¢«æ·»å å°çå¬å¨éåä¸ï¼å®å°æè·ææç±è¿è¡æ¶äº§ççè·è¸ªæ¶æ¯ï¼å¹¶å°è¾åºåéå°æ们çè®°å½å¨ãå®è¿å°åéæ们å¨åºç¨ç¨åºä¸æç¡®åéçä»»ä½è·è¸ªæ¶æ¯ï¼å°±åæ们å¨åé¢çmyFirstListenerä¾åä¸åçé£æ ·ï¼ã
å æ¤ï¼ä»»ä½æ·»å å°çå¬å¨éåççå¬å¨é½å¯ä»¥æè·ç±è¿è¡æ¶äº§ççè·è¸ªä¿¡æ¯ï¼ä»¥åå¨åºç¨ç¨åºä¸æç¡®åéçä»»ä½è·è¸ªä¿¡æ¯ãç¶èï¼å¦æä¸ä¸ªè·è¸ªçå¬å¨æ²¡æ被添å å°éåä¸ï¼å®åªè½åéåºç¨ç¨åºä¸æç¡®åéçè·è¸ªæ¶æ¯ãå®ä¸ä¼æè·ä»»ä½ç±è¿è¡æ¶äº§ççè·è¸ªæ¶æ¯ã
å½ä½¿ç¨èªå®ä¹è·è¸ªçå¬å¨æ¶ï¼ä½ å¿ é¡»è®°ä½å ³éæå·æ°è·è¸ªçå¬å¨ï¼ä»¥ç¡®ä¿è¾åºç¼å²åºè¢«æ¸ 空ãä½ å¯ä»¥å©ç¨StringBuilderCacheç±»æ¥ä¼åä½ ä½¿ç¨StringBuilderç代ç ï¼å¨CustomTraceListenerç±»ï¼ã
Android Activity Deeplink启动来源获取源码分析
Deeplink在业务模块中作为外部应用的入口提供,不同跳转类型可能会导致应用提供不一致的服务,通常通过反射调用Activity中的mReferrer字段获取跳转来源的包名。然而,mReferrer存在被伪造的风险,可能导致业务逻辑出错或经济损失。因此,我们需要深入分析mReferrer的来源,并寻找更为安全的获取方法。
为了深入了解mReferrer的来源,我们首先使用搜索功能在Activity类中查找mReferrer,发现其在Attach方法中进行赋值。进一步通过断点调试跟踪调用栈,发现Attach方法是由ActivityThread.performLaunchActivity调用的。而performLaunchActivity在调用Attach时,传入的referrer参数实际上是一个ActivityClientRecord对象的referrer属性。深入分析后,发现referrer是在ActivityClientRecord的构造函数中被赋值的。通过进一步的调试发现,ActivityClientRecord的实例化来自于LaunchActivityItem的mReferrer属性。接着,我们分析了mReferrer的来源,发现它最终是由ActivityStarter的setCallingPackage方法注入的。而这个setCallingPackage方法的调用者是ActivityTaskManagerService的startActivity方法,进一步追踪调用链路,我们发现其源头是在App进程中的ActivityTaskManager.getService()方法调用。
在分析了远程服务Binder调用的过程后,我们发现获取IActivityTaskManager.Stub的方法是ActivityTaskManager.getService()。这使得我们能够追踪到startActivity方法的调用,进而找到发起Deeplink的应用调用的具体位置。通过这个过程,我们确定了mReferrer实际上是通过Activity的getBasePackageName()方法获取的。
为了防止包名被伪造,我们注意到ActivityRecord中还包含PID和Uid。通过使用Uid结合包管理器的方法来获取对应的包名,可以避免包名被伪造。通过验证Uid的来源,我们发现Uid实际上是通过Binder.getCallingUid方法获取的,且Binder进程是无法被应用层干涉的,因此Uid是相对安全的。接下来,我们可以通过Uid来置换包名,进一步提高安全性。
总结,mReferrer容易被伪造,应谨慎使用。通过使用Uid来获取包名,可以提供一种更为安全的获取方式。此过程涉及对源代码的深入分析和调试,作者Chen Long为vivo互联网客户端团队成员。
Messier - 简单易用的Objective-C方法跟踪工具
欢迎来到Objective-C开发者们的福音——Messier,一款专为iOS应用性能跟踪量身打造的利器。它巧妙地填补了Time Profiler在展示时序信息方面的空白,针对iOS开发者对性能优化的迫切需求而诞生。尽管AppleTrace在年已崭露头角,但其易用性并未完全满足大家的期待。为了简化工作流程,提高效率,作者精心研发了Messier,一套包括Tweak越狱插件、动态messier.framework库以及桌面端追踪软件的完整解决方案。 在越狱设备上,Messier如同一位贴心的向导,只需简单几步就能启动追踪:首先,将messier.framework添加到你的Xcode项目中,点击Link Binary With Libraries。接着,在Project Scheme的Environment Variables中设置关键参数,如MessierEnableOnAppBoot、MessierInlineHook和MessierMainThreadMethodsOnly。连接设备后,通过USB接口启动追踪,任务完成后,点击Fetch trace.json按钮,获取宝贵的性能数据。 对于非越狱设备,你可以在源码或MonkeyDev环境中进行配置,同样能享受到Messier的追踪服务。无论你的设备版本是iOS及以上,Messier都能无缝适配。遇到任何问题,我们鼓励你积极参与讨论,分享你的体验和见解,官方群组就在https://messier.app/group等你。 Messier并非孤立之作,它建立在AppleTrace开源框架的基础上,并吸收了其他优秀项目的精华。每一滴改进都凝聚了开发者们的智慧和汗水。作为一款从零开始,不断优化易用性的软件,它值得你去探索和发现。访问我们的官方网站https://messier.app/,了解更多关于Messier的详细信息和下载链接,让性能追踪变得简单而高效。