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日志并进行多维度分析。
目录
相关文章
|
7天前
|
IDE Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【9月更文挑战第27天】在移动应用开发的世界中,Android和iOS是两个主要的操作系统平台。每个系统都有其独特的开发环境、工具和用户群体。本文将深入探讨这两个平台的关键差异点,并分析这些差异如何影响应用的性能、用户体验和最终的市场表现。通过对比分析,我们将揭示选择正确的开发平台对于确保项目成功的重要作用。
|
16天前
|
开发框架 数据可视化 Java
iOS开发-SwiftUI简介
iOS开发-SwiftUI简介
|
4天前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
21 7
|
7天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台解决方案
【9月更文挑战第27天】在移动应用开发的广阔天地中,安卓和iOS两大操作系统如同双子星座般耀眼。开发者们在这两大平台上追逐着创新的梦想,却也面临着选择的难题。如何在保持高效的同时,实现跨平台的开发?本文将带你探索跨平台开发的魅力所在,揭示其背后的技术原理,并通过实际案例展示其应用场景。无论你是安卓的忠实拥趸,还是iOS的狂热粉丝,这篇文章都将为你打开一扇通往跨平台开发新世界的大门。
|
13天前
|
前端开发 iOS开发 开发者
探索iOS开发中的SwiftUI框架
【9月更文挑战第21天】在iOS应用开发的广阔天地中,SwiftUI框架如一股清新之风,为开发者带来了声明式语法的便捷与高效。本文将深入探讨SwiftUI的核心概念、布局方式及数据绑定机制,同时通过实例演示如何运用SwiftUI构建用户界面,旨在引领读者领略SwiftUI的魅力,并激发其对iOS开发新趋势的思考与实践。
33 6
|
13天前
|
安全 Swift iOS开发
探索iOS开发之旅:Swift语言的魅力与挑战
【9月更文挑战第21天】在这篇文章中,我们将一起潜入iOS开发的海洋,探索Swift这门现代编程语言的独特之处。从简洁的语法到强大的功能,Swift旨在让开发者能够以更高效、更安全的方式构建应用程序。通过实际代码示例,我们会深入了解Swift如何简化复杂任务,并讨论它面临的挑战和未来的发展方向。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和知识。
30 4
|
24天前
|
IDE 开发工具 Android开发
安卓与iOS开发对比:平台选择对项目成功的影响
【9月更文挑战第10天】在移动应用开发的世界中,选择正确的平台是至关重要的。本文将深入探讨安卓和iOS这两大主要移动操作系统的开发环境,通过比较它们的市场份额、开发工具、编程语言和用户群体等方面,为开发者提供一个清晰的指南。我们将分析这两个平台的优势和劣势,并讨论如何根据项目需求和目标受众来做出最佳选择。无论你是初学者还是有经验的开发者,这篇文章都将帮助你更好地理解每个平台的特性,并指导你做出明智的决策。
|
22天前
|
API Android开发 iOS开发
安卓与iOS开发中的线程管理对比
【9月更文挑战第12天】在移动应用的世界中,安卓和iOS平台各自拥有庞大的用户群体。开发者们在这两个平台上构建应用时,线程管理是他们必须面对的关键挑战之一。本文将深入探讨两大平台在线程管理方面的异同,通过直观的代码示例,揭示它们各自的设计理念和实现方式,帮助读者更好地理解如何在安卓与iOS开发中高效地处理多线程任务。
|
24天前
|
开发框架 Android开发 iOS开发
探索安卓与iOS开发的差异:构建未来应用的指南
在移动应用开发的广阔天地中,安卓与iOS两大平台各占半壁江山。本文将深入浅出地对比这两大操作系统的开发环境、工具和用户体验设计,揭示它们在编程语言、开发工具以及市场定位上的根本差异。我们将从开发者的视角出发,逐步剖析如何根据项目需求和目标受众选择适合的平台,同时探讨跨平台开发框架的利与弊,为那些立志于打造下一个热门应用的开发者提供一份实用的指南。
51 5
|
24天前
|
开发工具 Android开发 iOS开发
安卓与iOS开发:平台选择的艺术与科学
在移动应用开发的广阔天地中,安卓与iOS两大平台如同东西方哲学的碰撞,既有共通之处又各具特色。本文将深入探讨这两个平台的设计理念、开发工具和市场定位,旨在为开发者提供一份简明扼要的指南,帮助他们在这场技术与商业的博弈中找到自己的道路。通过比较分析,我们将揭示每个平台的优势与局限,以及它们如何影响应用的性能、用户体验和市场接受度。无论你是初涉江湖的新手,还是经验丰富的老手,这篇文章都将为你的选择提供新的视角和思考。
31 5