LOG_INFO 宏在特定字符串崩溃
问题已经找到。在 LogInternal 宏中的拼接 aMessage 可能由于异常字符串导致崩溃。
机型: 5C, 系统版本: 9.3.1 重现步骤: 将提供的JSON字符串通过LOG_INFO保存就会崩溃.(需要在导出IPA后安装才会,直接编译运行不行)。
{"code":0,"data":{"productName":"\u677e\u679c\u503e\u8bc9\u5145\u503c","productDescription":"\u677e\u679c\u503e\u8bc9\u5145\u503c","orderid":"2521283","tradeNO":"201901049749524911293008228","serviceDuration":0,"prepay_id":"","nonce_str":"","timestamp":"","sign":"","money":"666","thirdPayMoney":"666","orderData":{"textNumber":"","orderType":"3"},"userCreate":"1543401880","paypalToken":"","paypalAmount":"0","alipayStr":"app_id=2018101961746127&version=1.0&format=json&sign_type=RSA2&method=alipay.trade.app.pay×tamp=2019-01-04+11%3A29%3A30¬ify_url=https%3A%2F%2Fprf.51songguo.com%2Fapp%2FOrderReturn%2FOrderFinishV2&charset=UTF-8&biz_content=%7B%22subject%22%3A%22%5Cu677e%5Cu679c%5Cu503e%5Cu8bc9%5Cu5145%5Cu503c%22%2C%22out_trade_no%22%3A%22201901049749524911293008228%22%2C%22total_amount%22%3A%22666%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%7D&sign=RkLuvceuGa3LLFQ%2FcIW3GYFz4jta5qo%2FNJPBaN1E%2Bw3fGMsaPXdUGOvKhiAY%2BLZDQ13IccURhmi9YRGp%2F8qAKecuSphcmfccGAhAHWGFcjtgTBkXN37Tmglv5hEblav5urgt6PgHi%2FF8yU%2BUatI3AlJjks4Wr52Da2XWSpepXsyEne4h1JuXgDQvyEhfEL9EVmVL59QpM2PYfGwmFi1GhrmxUkiks43k0t6oNW82jhZBfTXYcrtSIpUQ9716oU9V4FbiWPZqSWUtDgt4o0o7VbkZNjF0qvWLjW1Mnb6R60RYSB5Bb5i9nwnlbsY00Uy52LYmloMy3PVA%2FxAFs6kx6g%3D%3D"},"msg":"\u521b\u5efa\u6210\u529f","count":0,"sign":"2ef9ce3f9f6f56dc82f0d5c6fe7b3e13"}
补充一张Bugly崩溃堆栈截图,在崩溃中看不到什么有用的信息。

只在 系统版本: 9.3.1 上出现吗? 我手上没这个系统版本。
我只在这台设备上重现过。没有尝试过其他低版本设备(公司没iOS 8的机器,所以也测不了,但是iOS 10的没问题)
猜测原因可能是 LogInternal 宏中用到了 ##__VA_ARGS__ 去匹配可变参数,但是遇到字符串中有 % 这种符号,就造成了占位符、参数个数不匹配导致的。(测试过移除其中带%的那个参数后打印正常)
修复这个问题花了我两天时间,如果官方团队有空的话可以改进一下Demo.
我这边没办法重现。你那边是否可以多测两个场景。
- 自己写个类似的宏格式化,看是否会 crash
- 直接用 %@ 去格式化这段字符串,是否会 crash
好,不过得等下周了。得先赶赶需求。
不过第二点的话,我就是改成这样子修复好的。

+1,也是在release下会崩溃