Basic debugging using logging for iOS apps

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Basic debugging using logging for iOS apps

文章目录

  • 前言
  • I 、 DEBUG 宏的应用

  • 1.1 发布模式关闭NSLog
  • II、 NSLog调试技巧

  • 2.1 Where to find NSLog's output
  • 2.2 Improved logging in Objective-C
  • 2.1 Objective-C's boxing capability (`装箱`快速构造数字对象)
  • 2.2 知识补充:装箱和拆箱
  • see also

  • Log facility 和level的关系
  • 常见的日志文件
  • 配置【生成/存储日志】策略: `vim /etc/rsyslog.conf`
  • 配置IP




前言



今天周末时间关系,此文只完成了部分内容,后续完整内容请移步到博客(kunnan.blog.csdn.net

  • 本文demo(请到博客看链接:kunnan.blog.csdn.net)

I 、 DEBUG 宏的应用

  • 应用场景:区分调试模式和发布模式进行特殊处理
  • 自定义preprocessor macro:

The DEBUG preprocessor macro setting in an Xcode project

image.png

1.1 发布模式关闭NSLog

//调试模式
#ifdef DEBUG
#define NSLog(...)     NSLog(__VA_ARGS__)
#define KisDebug 1
//#define NSLog(fmt, ...) NSLog((@"[文件名:%s]\n" "[函数名:%s]\n" "[行号:%d] \n" fmt), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);
#else//发布模式
#define NSLog(...)
#define KisDebug 0
#endif

II、 NSLog调试技巧

2.1 Where to find NSLog’s output

NSLog outputs messages to the Apple System Log facility or to the Console app

image.png

2.2 Improved logging in Objective-C

  • Improved logging in Objective-C

image.png

  • Format specifiers for data types

image.png

2.1 Objective-C’s boxing capability (装箱快速构造数字对象)

The printf function NSLog offers a number of substitution tokens for printing numbers (%d, %ld, %f, %d, for example). As a convenience, you can use Objective-C’s boxing capability to save time and avoid compiler warnings.

  • For example

image.png

平常也可以使用@ 来快速包装数字类型以对象的形式进行存储和传参

image.png

    [discountArray addObject:[[ self class] mj_objectWithKeyValues:@{@"placeholder":QCTLocal(@"please_input_card_num"),@"btnContent":QCTLocal(@"member_see"),@"EnterModelType":@2,@"isEnabled":@1,@"isLast":@1,@"block":block}]];

2.2 知识补充:装箱和拆箱

  • Java包装类(装箱和拆箱)

全部被final修饰,顺便提一下,java.lang.Math,System,String也被final修饰

包装类是使用面向对象的思想把简单的数据类型封装成类。

1.特点

包装类把简单的数据类型包装成类。

注:简单数据类型不是类,使用简单数据类型主要为了提高代码的运行效率

2.装箱和拆箱

把简单数据类型包装成对应的包装类称为boxing(示例:Integer i=1;将1包装成Integer再使用Object引用Integer对象)

把包装类型转换成简单数据类型称为unboxing(示例:Integer i=1,int p=i;//将包装类Integer转化成简单数据类型int)

注:Integer的拆箱方法为 int intValue(),其他的包装类以此类推

1)包装类都重写了toString方法,equals方法,hashCode方法

2)Integer的API:

String toBinaryString(int i); 将int类型的数据以二进制字符串形式返回

int parseInt(String) 将字符串转化成int类型

int parseInt(Stringstr,int i ) 将字符串转化成对应的进制 类型,str为被转换的字符串,i为进制类型(10,8,16)

Integer valueof(String str) 将字符串转换成Integer类型。

see also

  • String Format Specifiers
Specifier Description
%@ Objective-C object, printed as the string returned by descriptionWithLocale: if available, or descriptionotherwise. Also works with CFTypeRef objects, returning the result of the CFCopyDescription function.
%% '%' character.
%d, %D Signed 32-bit integer (int).
%u, %U Unsigned 32-bit integer (unsigned int).
%x Unsigned 32-bit integer (unsigned int), printed in hexadecimal using the digits 0–9 and lowercase a–f.
%X Unsigned 32-bit integer (unsigned int), printed in hexadecimal using the digits 0–9 and uppercase A–F.
%o, %O Unsigned 32-bit integer (unsigned int), printed in octal.
%f 64-bit floating-point number (double).
%e 64-bit floating-point number (double), printed in scientific notation using a lowercase e to introduce the exponent.
%E 64-bit floating-point number (double), printed in scientific notation using an uppercase E to introduce the exponent.
%g 64-bit floating-point number (double), printed in the style of %e if the exponent is less than –4 or greater than or equal to the precision, in the style of %f otherwise.
%G 64-bit floating-point number (double), printed in the style of %E if the exponent is less than –4 or greater than or equal to the precision, in the style of %f otherwise.
%c 8-bit unsigned character (unsigned char).
%C 16-bit UTF-16 code unit (unichar).
%s Null-terminated array of 8-bit unsigned characters. Because the %s specifier causes the characters to be interpreted in the system default encoding, the results can be variable, especially with right-to-left languages. For example, with RTL, %s inserts direction markers when the characters are not strongly directional. For this reason, it’s best to avoid %s and specify encodings explicitly.
%S Null-terminated array of 16-bit UTF-16 code units.
%p Void pointer (void *), printed in hexadecimal with the digits 0–9 and lowercase a–f, with a leading 0x.
%a 64-bit floating-point number (double), printed in scientific notation with a leading 0x and one hexadecimal digit before the decimal point using a lowercase p to introduce the exponent.
%A 64-bit floating-point number (double), printed in scientific notation with a leading 0X and one hexadecimal digit before the decimal point using a uppercase P to introduce the exponent.
%F 64-bit floating-point number (double), printed in decimal notation.
  • Format specifiers for data types
Type Format specifier Considerations
NSInteger %ld or %lx Cast the value to long.
NSUInteger %lu or %lx Cast the value to unsigned long.
CGFloat %f or %g %f works for floats and doubles when formatting; but note the technique described below for scanning.
CFIndex %ld or %lx The same as NSInteger.
pointer %p or %zx %p adds 0x to the beginning of the output. If you don’t want that, use %zx and no typecast.
  • Basic debugging

Log facility 和level的关系

NSLog outputs messages to the Apple System Log facility or to the Console app

image.png

  • facility:是系统对某种类型事件的定义。

LOG_AUTH

LOG_AUTHPRIV 安全认证

LOG_CRON clock daemon (cron and at) 计划任务事件

LOG_DAEMON 后台进程

LOG_FTP ftp daemon

LOG_KERN kernel messages

LOG_LOCAL0 through LOG_LOCAL7 用户自定义设备

LOG_LPR printer subsystem

LOG_MAIL 邮件系统mail subsystem

LOG_NEWS news subsystem

LOG_SYSLOG syslogd自身产生的日志

LOG_USER (default)

  • level :指遇到何种情况才记录日志

从下到上,级别从低到高,记录的信息越来越少

LOG_EMERG 紧急,致命,服务无法继续运行,如配置文件丢失

LOG_ALERT 报警,需要立即处理,如磁盘空使用95%

LOG_CRIT 致命行为

LOG_ERR 错误行为

LOG_WARNING 警告信息

LOG_NOTICE 普通,重要的标准信息

LOG_INFO 标准信息

LOG_DEBUG 调试信息,排错所需,一般不建议使用

常见的日志文件

tail /var/log/messages //系统主日志文件

tail -20 /var/log/messages

tail -f /var/log/messages //动态查看日志文件的尾部

tailf /var/log/secure //认证、安全

tail /var/log/maillog //跟邮件postfix相关

tail /var/log/cron //crond、at进程产生的日志

tail /var/log/dmesg //和系统启动相关

tail /var/log/audit/audit.log //系统审计日志

tail /var/log/yum.log //yum

tail /var/log/mysqld.log //MySQL

tail /var/log/xferlog //和访问FTP服务器相关

w //当前登录的用户 /var/log/wtmp

last //最近登录的用户 /var/log/btmp

lastlog //所有用户的登录情况 /var/log/lastlog

配置【生成/存储日志】策略: vim /etc/rsyslog.conf

由设备+级别+存放位置组成

FACILITY+LEVEL+FILE组成:

authpriv.* /var/log/secure(SSH信息)

mail.* -/var/log/maillog(发邮件)

cron.* /var/log/cron(创建任务)

authpriv.* * <代表所有终端>
authpriv.
@192.168.10.230

authpriv.* @@192.168.10.230

配置IP

  • /etc/sysconfig/network-scripts/ifcfg-enp2s0中各个参数的意义

vim /etc/sysconfig/network-scripts/ifcfg-enp2s0

NAME=“enp2s0”

DEVICE=“enp2s0”

ONBOOT=yes //是否启用该设备

BOOTPROTO=none //手动(none/static)还是自动(dhcp)

IPADDR=172.16.120.246 //地址

PREFIX=24 //掩码

IPADDR1=192.168.200.246 //额外地址

PREFIX1=24 //额外掩码,注意编号

GATEWAY=172.16.120.254 //网关

DNS1=8.8.8.8 //DNS

DNS2=114.114.114.114 //DNS2


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
6天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
1月前
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
114 1
|
1月前
|
设计模式 安全 Swift
探索iOS开发:打造你的第一个天气应用
【9月更文挑战第36天】在这篇文章中,我们将一起踏上iOS开发的旅程,从零开始构建一个简单的天气应用。文章将通过通俗易懂的语言,引导你理解iOS开发的基本概念,掌握Swift语言的核心语法,并逐步实现一个具有实际功能的天气应用。我们将遵循“学中做,做中学”的原则,让理论知识和实践操作紧密结合,确保学习过程既高效又有趣。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你打开一扇通往iOS开发世界的大门。
|
1月前
|
搜索推荐 IDE API
打造个性化天气应用:iOS开发之旅
【9月更文挑战第35天】在这篇文章中,我们将一起踏上iOS开发的旅程,通过创建一个个性化的天气应用来探索Swift编程语言的魅力和iOS平台的强大功能。无论你是编程新手还是希望扩展你的技能集,这个项目都将为你提供实战经验,帮助你理解从构思到实现一个应用的全过程。让我们开始吧,构建你自己的天气应用,探索更多可能!
66 1
|
13天前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
35 9
|
9天前
|
设计模式 Swift iOS开发
探索iOS开发:从基础到高级,打造你的第一款App
【10月更文挑战第40天】在这个数字时代,掌握移动应用开发已成为许多技术爱好者的梦想。本文将带你走进iOS开发的世界,从最基础的概念出发,逐步深入到高级功能实现,最终指导你完成自己的第一款App。无论你是编程新手还是有志于扩展技能的开发者,这篇文章都将为你提供一条清晰的学习路径。让我们一起开始这段旅程吧!
|
13天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。
|
11天前
|
iOS开发 开发者
探索iOS开发中的SwiftUI框架
【10月更文挑战第39天】在苹果的生态系统中,SwiftUI框架以其声明式语法和易用性成为开发者的新宠。本文将深入SwiftUI的核心概念,通过实际案例展示如何利用这一框架快速构建用户界面,并探讨其对iOS应用开发流程的影响。
|
14天前
|
JSON 前端开发 API
探索iOS开发之旅:打造你的第一个天气应用
【10月更文挑战第36天】在这篇文章中,我们将踏上一段激动人心的旅程,一起构建属于我们自己的iOS天气应用。通过这个实战项目,你将学习到如何从零开始搭建一个iOS应用,掌握基本的用户界面设计、网络请求处理以及数据解析等核心技能。无论你是编程新手还是希望扩展你的iOS开发技能,这个项目都将为你提供宝贵的实践经验。准备好了吗?让我们开始吧!
|
19天前
|
设计模式 前端开发 Swift
探索iOS开发:从初级到高级的旅程
【10月更文挑战第31天】在这篇文章中,我们将一起踏上iOS开发的旅程。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧。我们将从基础开始,逐步深入到更高级的技术和概念。让我们一起探索iOS开发的世界吧!
下一篇
无影云桌面