iOS调试技巧之Log

深入理解iOS Crash Log Crash Log Crash Log的主要来源有两种: Apple提供的,可以从用户设备中直接拷贝,或者从iTunes Connect(XCode)下载 三方或者自研Framework统计,三方服务包括Fabric,Bugly等。 这篇文章讲到的Crash Log是Apple提供的。 获取 设备获取 USB连接设备,接着在XCode菜单栏依次选择:Window ->... 阅读详情

iOS调试技巧之Log

欢迎加QQ群讨论:157672725
博客地址:http://catchzeng.leanote.com/

为什么我的程序比别人耗内存、bug多、体验差?这些其实多多少少跟调试有关。调试能帮我们快速定位bug位置、优化程序运行速度等等。调试的方法很多,本文主要讲一下Log调试。
默认的NSLog局限太多,下面让我们看看如何实现一个不一样的Log。


Log

在调试的过程中,我们常常使用NSLog来向控制台输出一些信息。但是,NSLog的局限较大:

  • 无法log到文件
  • 不支持分级log
  • NSLog耗时,降低程序的运行效率

为了解决这个问题,早期工程我使用宏开关来做控制Log的输出:

#define __LOG__   8

#if __LOG__&8
#define HHLogErr(fmt, ...)  {NSLog((@"<Error> %s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);}
#else
#define HHLogErr(x, ...)
#endif

#if __LOG__&4
#define HHLogWarn(fmt, ...)   {NSLog((@"<Warning> %s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);}
#else
#define HHLogWarn(x, ...)
#endif

#if __LOG__&2
#define HHLogInfo(fmt, ...)   {NSLog((@"<Info> %s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);}
#else
#define HHLogInfo(x, ...)
#endif

#if __LOG__&1
#define HHLogVerbose(fmt, ...) {NSLog((@"<Verbose> %s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);}
#else
#define HHLogVerbose(x, ...)
#endif

这种方式虽然能解决一部分问题,但是仍然不完美。后面在github上找到了Cocoa LumberJack https://github.com/CocoaLumberjack/CocoaLumberjack ,它能帮我们解决NSlog的局限问题。

效果:

这里写图片描述

实现:

1.pod安装CocoaLumberjack

pod 'CocoaLumberjack'

2.新建一个类定义LOG_LEVEL_DEF 宏,并把该类.h文件添加到pch文件中

@interface HHProfile : NSObject

#define LOG_LEVEL_DEF      DDLogLevelAll
//注意:LOG_LEVEL_DEF不能改变,因为该宏在框架中需要使用[ DDLogLevelOff DDLogLevelError DDLogLevelWarning DDLogLevelInfo DDLogLevelDebug DDLogLevelVerbose DDLogLevelAll ]

@end
#ifndef PrefixHeader_pch
#define PrefixHeader_pch

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import "HHProfile.h"
#import "CocoaLumberjack.h"

#endif

3.配置log

    // Add File Log
    DDFileLogger* fileLogger = [[DDFileLogger alloc] init];
    fileLogger.rollingFrequency = 60 * 60 * 24; // 24 hour rolling
    fileLogger.logFileManager.maximumNumberOfLogFiles = 7;
    [DDLog addLogger:fileLogger];

    // Add Apple System Log
    [DDLog addLogger:[DDASLLogger sharedInstance]];

    // Enable XcodeColors
    setenv("XcodeColors", "YES", 0);
    // Add Standard lumberjack initialization
    [DDLog addLogger:[DDTTYLogger sharedInstance]];
    // And then enable colors
    [[DDTTYLogger sharedInstance] setColorsEnabled:YES];

    // Set colors for levels
    [[DDTTYLogger sharedInstance] setForegroundColor:[UIColor blueColor] backgroundColor:nil forFlag:DDLogFlagInfo];
    [[DDTTYLogger sharedInstance] setForegroundColor:[UIColor greenColor] backgroundColor:nil forFlag:DDLogFlagDebug];
    [[DDTTYLogger sharedInstance] setForegroundColor:[UIColor lightGrayColor] backgroundColor:nil forFlag:DDLogFlagVerbose];

    // Set format
    HHLogFormatter* logFormatter = [[HHLogFormatter alloc]init];
    [fileLogger setLogFormatter:logFormatter];
    [[DDASLLogger sharedInstance] setLogFormatter:logFormatter];
    [[DDTTYLogger sharedInstance] setLogFormatter:logFormatter];

其中HHLogFormatter是我自定义的一个输出格式。它能输出日期、文件名、出错行数、出错信息、出错方法名等,更加方便调试。

4.其中log的分级分颜色显示是我最喜欢CocoaLumberjack的地方。实现颜色的不同显示需要安装插件Alcatraz(Alcatraz安装见http://blog.youkuaiyun.com/catch01/article/details/46275293),并搜索XcodeColors安装(安装完毕需重启Xcode生效),如下图。
这里写图片描述

Demo地址: https://github.com/catchZeng/HHLog

iOS应用开发中,打印调试日志是一种常见的调试技术,它可以帮助开发人员追踪代码执行过程中的问题 在开发和调试过程中,打印调试日志是一种非常有用的技术,它可以帮助我们追踪代码的执行过程,找出问题并进行调试。在上面的示例中,我们定义了一个名为DebugLog的宏,它使用NSLog函数来打印日志。CocoaLumberjack是一个功能强大的日志库,它提供了更高级的日志管理功能,比如日志级别控制、日志文件保存等。iOS应用开发中,打印调试日志是一种常见的调试技术,它可以帮助开发人员追踪代码执行过程中的问题。本文将介绍几种在iOS应用中打印调试日志的方法,并提供相应的源代码示例。 阅读详情

相关推荐

电商平台大数据分析指标

一、五大关键数据分析指标 1.1活跃用户量 活跃用户量是一个基本的指标,有 DAU(日活跃用户)、WAU(周活跃用户)和 MAU(月活跃用户)三个层次; 1.2转化 转化是一个非常重要的指标,电商运营需要关注主路径、次路径甚至精细到每一个品类 / SKU 的转化率; 1.3留存 留存要从不同的时间周期上研究,包括次日留存率、3 日、7 日、30 日留存; 1.4复购 复购则要从 3 个角度去看,复购用户量、复购率和复购金额比; 1.5GMV GMV 是最重要的指标,我们的运营最终是围绕这

默主归沙的博客 4818

iOS Log格式化输出

#import <Foundation/Foundation.h> #import <CocoaLumberjack.h> NS_ASSUME_NONNULL_BEGIN @interface iCLogFormatter : NSObject<DDLogFormatter> @end NS_ASSUME_NONNULL_END #import ...

FIGHTING的专栏 1179

YOLOv11垃圾检测实战:从零搭建带GUI的智能分类系统(附完整数据集)

本文详细介绍了如何从零开始构建一个基于YOLOv11的智能垃圾检测系统,并集成图形化界面。内容涵盖数据集构建与增强、模型选型与轻量化改进(如引入注意力机制),以及使用PyQt5开发稳定GUI的完整流程,旨在解决实际部署中精度与速度的平衡问题,为环保科技等应用场景提供可落地的解决方案。

646

iOS发布时设置不打印log

前提:在开发过程,我们为了调试经常要打印日志信息,但在发布版本时,打印信息是会消耗应用性能的。 情况一:初始化项目时,在预编译文件PrefixHeader.pch中做判断,把NSLog替换成自己的log,t调试时使用自己的log,代码如下 #ifdef DEBUG #define WSLog(...)  NSLog(__VA_ARGS__) #else #define WSL

u011584787的博客 786

为什么我的 Spark Executor / Yarn Container 只有一个vCore?

在很多集群里,在关闭了Spark的DynamicAllocation的前提下(避免自动申请空闲资源,干扰测试结果),都会观察到:提交Spark作业时,申请 1 个 driver + n 个 executor 会在Yarn上会对应创建 n+1 个 container,但是每个container只有一个vCore,通过--driver-cores和--executor-cores设定的vCore数都未奏效。有人会因此错误的认为Yarn上的一个vCore对应一个Spark的executor,这是非常错误的,正确的

Laurence的技术博客 916

在windows系统上使用codex出现应用程序无法正常启动(0xc0000022)的解决方案

本文主要介绍了在windows系统上使用codex出现应用程序无法正常启动(0xc0000022)的解决方案,希望能对使用codex的同学们有所帮助。 文章目录 1. 问题描述 2. 原因分析 3. 解决方案

weixin_43178406的博客 10万+

iOS 将Log日志输出到文件中保存

对于那些做后端开发的工程师来说,看LOG解Bug应该是理所当然的事,但我接触到的移动应用开发的工程师里面,很多人并没有这个意识,查Bug时总是一遍一遍的试图重现,试图调试,特别是对一些不太容易重现的Bug经常焦头烂额。而且iOS的异常机制比较复杂,Objective-C的语言驾驭也需要一定的功力,做出来的应用有时候挺容易产生崩溃闪退。一遍一遍的用XCode取应用崩溃记录、解析符号,通常不胜其烦,有时

Levilly的博客 1万+

【自适应调制】自适应调制解调通信链路误码率matlab仿真与分析

BPSK中的B是“Binary”的意思,也就是有两个变化状态,比如说相位上的“+90°(代表1)、-90°(代表0)”,一个状态代表的就是一个比特。QPSK的“Q”是“Quadrature”的意思,有四个变化状态,如相位上的“+45°(代表00)、-45°(代表11)、+135°(代表10)、-135°(代表01)”,那么一个状态就代表两个比特的信息,如图2所示。同理8PSK的一个状态代表三个比特。但是功率资源并不是无限的,基站总的发射功率是一定的,为了充分利用所有的功率,采用的就是AMC技术。

FPGA/MATLAB学习教程/源码/项目合作开发 1833

IOS中的log用法

1.自定义宏实现log #define NSLog(format, ...) do {                                                                          \                                fprintf(stderr, " %s\n",                  

choudang的专栏 2541

1.2、基于卷积神经网络(CNN)的车牌自动识别系统(matlab)

基于卷积神经网络(CNN)的车牌自动识别系统(matlab)

XU157303764的博客 2911

数学建模算法案例精讲500篇-【深度强化学习】深度确定性策略梯度(DDPG)(附MATLAB和python代码实现)

它是一种学习连续动作的无模型策略算法。它结合了DPG(确定性策略梯度)和DQN(深度Q网络)的思想。它利用DQN中的经验重放和延迟更新的目标网络,并基于DPG,可以在连续的动作空间上运行。# 用于生成带有噪声的动作def __init__(self, action_space, mu=0.0, theta = 0.15, max_sigma = 0.3, min_sigma = 0.3, decay_period = 100000):#decay_period要根据迭代次数合理设置# 均值 mu。

qq_36130719的博客 325

5分钟用Docker部署Krawl:启动你的第一个Web蜜罐的最快指南

如果你正在寻找一套能快速上手的 Web 蜜罐方案,**Krawl** 是目前最省心的开源选择之一:这个云原生的欺骗服务器(Web deception server)只需一条 Docker 命令就能在 5 分钟内跑起来,自动生成带有"低垂果实"(假管理员后台、假 .env、假凭据文件)的逼真网页,引诱并记录攻击者与恶意爬虫的行为。本教程带你用 Docker 从零完成部署,直到打开实时监控面板。 #

gitblog_00176的博客 1139

电动汽车远程监控与诊断软件:BMW ConnectedDrive EV远程监控二次开发_7.数据安全与隐私保护

数据加密是保护数据安全的重要手段之一。在电动汽车远程监控与诊断软件中,加密技术可以确保数据在传输过程中的安全性和完整性。常见的加密技术包括对称加密和非对称加密。

zhubeibei168的博客 884

iOS开发调试技巧(一)

在iOS开发中调试是必不可少的,同时也是必须学会的技能,重要性不言而喻。今天我们就来初步了解下一些常用技巧。暂时使用的是OC语言。 此文也可以进入我的简书阅读 1、普通断点(经常用到) 当程序运行到断点处时会停止运行,只要在显示行数的相对应的地方点击一下就添加了一个端点。 添加的端点可以在如下图的地方查看。 程序运行到断点处,可以看

william66688的博客 474

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

iOS调试技巧总结

对于大型APP,每次修改重新编译,都需要几分钟时间,因此要在一次运行中尽量多的解决问题,减少编译的次数。 无论是需求的迭代,还是bug的调试,都可能会遇到陌生的代码,对于不熟悉的代码,如何调试呢? 一 打Log 只需要一行输出函数,即可看到各个方法的执行顺序,知道输入、输出值,但是对代码入侵性太强,并且频繁修改消耗过多编译的时间。 二 问写代码的人 最直接最高效。但是如果不经过思考,就直接问,下次遇到类似的问题还是不会。因此我认为最好先自己调试,如果几个小时还无法解决,再请教。 对于遇到的问题,不能仅仅当成

慢跑20 432

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

iOS调试技巧之打印输出 -----A: (NSString *)description B:自定义LOG C:使用第三方插件快速打印...

A:重写- (NSString *)description函数 如果有一个Product 产品对象 Product.h中 1 #import <Foundation/Foundation.h> 2 3 typedef enum : NSUInteger { 4 RED = 1, 5 GREEN, 6 } ProductC...

dcy6443的博客 449

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

iOS各种调试技巧豪华套餐(上)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33883178的博客 136

前端调试技巧大全

对于大文件传输,关注Waterfall图表中的阻塞时间,往往能发现CDN配置或服务器压缩的问题。真正的调试高手往往善于组合使用各种工具,比如将性能分析器与代码覆盖率报告结合,或利用Source Map反向定位压缩代码的问题。记住,最好的调试工具是系统化的思考方式——从用户行为复现到逻辑推理,再到工具验证,形成完整的调试闭环。在快节奏的前端开发中,高效的调试技巧是开发者最锋利的武器。无论是解决布局错乱、性能瓶颈,还是追踪难以捉摸的JavaScript错误,掌握系统化的调试方法能显著缩短问题排查时间。

khxtsf_472的博客 233

Xcode Debug调试汇总

未完待续,[继续总结] LLDB &amp;&amp; GDB lldb与gdb命令对比 常用的Debug快捷键 功能 命令 暂停/继续 cmd + ctrl + Y 断点失效/生效 cmd + Y 控制台显示/隐藏 cmd + shift + Y 光标切换到控制台 cmd + shift + C 清空控制台 cmd + K step over F6 step...

weixin_33853794的博客 555

Hybrid App 应用开发中 9 个必备知识点复习(WebView / 调试 等)

前言 我们大前端团队内部

pingan8787 869

iOS App分发

一:如何打包并分发安装? 我们都知道,为苹果开发应用需要通过苹果审核并在App Store上架,但审核周期极为漫长,同时如果需要在发布前,想通过内侧的方式对自己的应用进行测试,都需要用到程序的打包方式,下面,介绍几种主要的打包方式: 分发安装包供越狱机使用 程序打包前,需要有与应用对应的App ID以及对应的Distribution版本的Provisioning File,

Bluelich的专栏 1347

Flutter开发避坑:调试时Logcat不灵了?手把手教你查看Android/iOS真机日志的正确姿势

本文详细解析了Flutter开发中Android/iOS真机日志查看的常见问题与解决方案。通过配置双视图模式、高级Logcat过滤技巧及Xcode控制台操作,帮助开发者高效捕获原生日志,提升调试效率。特别针对混合调试场景,介绍了表达式断点和跨平台日志聚合的实用技巧。

weixin_30340617的博客 331

iOS调试-通过lldb断点来打印log

相信还有很多人和我一样,当调试时想要查看某个参数的值的时候,会在代码中用log打印,然后重新运行。当log多了后,常常容易搞乱,而且总是重新运行、调试完删除log都很费事。这里介绍通过lldb来增加调试效率。        调试中我们经常需要打断点,当程序运行到断点时,程序会暂停,此时控制台会出现 (lldb)        这就表示我们可以在控制台里输入lldb指令进行操作(Xcode5

树深时见鹿 1725

安卓开发:打印Log

在iOS开发中使用NSLog进行打印调试,在安卓中使用的是Log.v(tag, msg);等进行打印调试。 参考:【https://blog.youkuaiyun.com/salary/article/details/82686550】 转载于:https://www.cnblogs.com/cchHers/p/11326978.html...

CCCCCC1990的博客 180

获取 iOS crash log

在ios开发过程中,经常会遇到应用在开发过程中或者自己测试时不会有问题。而在安装到别人设备上,或者上传应用商店被别人下载的时候,总是被抱怨程序不定期的crash,真的很令人懊恼!   获取 iOS crash log 这时iOS crash log 派上用场了,程序的大多数crash都会记录在用户的手机中,获取crash log的方法有两种: 1. 用户把设备连接到电脑上,打开xcode-

Suk的专栏 2万+

MoltenVK调试终极指南:如何使用Metal Frame Capture快速定位问题

**MoltenVK** 是 Vulkan Portability 实现,它将高性能的行业标准 Vulkan 图形和计算 API 层叠在 Apple 的 Metal 图形框架之上,使 Vulkan 应用程序能够在 macOS、iOS 和 tvOS 上运行。作为连接 Vulkan 和 Metal 的桥梁,MoltenVK 为开发者提供了在 Apple 生态系统中使用 Vulkan 的强大能力。 #

gitblog_00043的博客 926
上一篇: 屏幕适配之Size Classes 2---分屏适配
下一篇: Mac下Maven环境搭建
CatchZeng
博客等级 码龄15年 4粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值