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日志并进行多维度分析。
目录
相关文章
|
24天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
1天前
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
77 66
|
11天前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
|
16天前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
17天前
|
存储 前端开发 Swift
探索iOS开发:从新手到专家的旅程
本文将带您领略iOS开发的奇妙之旅,从基础概念的理解到高级技巧的掌握,逐步深入iOS的世界。文章不仅分享技术知识,还鼓励读者在编程之路上保持好奇心和创新精神,实现个人成长与技术突破。
|
20天前
|
安全 IDE Swift
探索iOS开发之旅:从初学者到专家
在这篇文章中,我们将一起踏上iOS开发的旅程,从基础概念的理解到深入掌握核心技术。无论你是编程新手还是希望提升技能的开发者,这里都有你需要的指南和启示。我们将通过实际案例和代码示例,展示如何构建一个功能齐全的iOS应用。准备好了吗?让我们一起开始吧!
|
25天前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
29 2
|
1月前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
47 9
|
27天前
|
vr&ar Android开发 iOS开发
安卓与iOS开发中的用户界面设计原则
【10月更文挑战第41天】探索移动应用开发的精髓,本文将深入分析安卓和iOS平台上用户界面设计的核心原则。通过比较两大操作系统的设计哲学,我们将揭示如何打造直观、易用且美观的应用程序界面。无论你是初学者还是资深开发者,这篇文章都将为你提供宝贵的见解和实用的技巧,帮助你在竞争激烈的应用市场中脱颖而出。
|
28天前
|
设计模式 Swift iOS开发
探索iOS开发:从基础到高级,打造你的第一款App
【10月更文挑战第40天】在这个数字时代,掌握移动应用开发已成为许多技术爱好者的梦想。本文将带你走进iOS开发的世界,从最基础的概念出发,逐步深入到高级功能实现,最终指导你完成自己的第一款App。无论你是编程新手还是有志于扩展技能的开发者,这篇文章都将为你提供一条清晰的学习路径。让我们一起开始这段旅程吧!