控制台输出

部署运行你感兴趣的模型镜像

原文地址:http://www.jianshu.com/p/c69f34e436e7

这里记录一下自己学习到的一些XCode调试的方法。这些调试方法可以让我们使用XCode编写代码进行调试时用起来更顺心应手。

XCode的调试方法包括运行时设置断点,打印到控制台,手写命令打印等。

1. 运行时设置断点

在XCode中需要观察的变量所在的代码处添加断点,可以让程序运行到这里暂停。这时鼠标悬停在变量名处,XCode会显示出该变量的信息。

断点的类型分为异常断点(Exception Breakpoint)和符号断点(Symbolic Breakpoint)等,在XCode断点浏览器(Breakpoints Navigator)的左下方可以添加这些断点。

符号断点中的符号可以指方法名称或函数名称。符号断点可以中断某个函数的调用。用户还可以添加执行断点的条件。



异常断点可以使程序在每次发生异常时,都会被中断。一般用来捕获未知异常。

2. 打印到控制台

控制台位于XCode的底端,用于打印程序运行过程中的输出信息。在代码中调用NSLog函数,可以打印变量值到控制台中显示出来。

NSLog(@"obj:%@", obj);

需要特别注意的是,尽管NSLog可圈可点,但在实际应用中要防备其可能会引起安全问题,因为任何由NSLog输出的内容都会成为应用程序成品代码

的一部分,也就是说会被任何接触到应用的人看到。只要把设备接入信息管理工具,每个人都能查看控制台信息并查询每一条日志记录。这可能会引发一系列严重后

果,例如向控制台输出机密逻辑算法或者用户密码等信息。

我们可以使用宏来解决调用NSLog方法可能导致的安全问题,只在调试版本中调用NSLog。可以采用全局可访问的头文件,把所有日志记录都灌进去,而且不用担心它们会出现在成品代码当中。

#ifdef DEBUG#define DMLog(...) NSLog(@"%s %@", __PRETTY_FUNCTION__, [NSString stringWithFormat:__VA_ARGS__])#else#define DMLog(...) do { } while (0)

现在如果我们使用DMLog(这个名称可以随便起),它将只向调试版本输出结果,任何成品代码都不会受到影响。PRETTY_FUNCTION也帮上了大忙,它会根据日志信息来源为函数命名。

3. 在控制台端手写命令打印

如果我们在应用的特定点进行中断,一般来说是为了检查对象的当前状态。Xcode为我们提供了一套“variables view(变量视图)”,该视图位于Xcode底部,与控制台相邻的左方区域。理论上讲它的作用是显示与当前环境相关的所有值的实时状态,但在实践中有时无法列出值,或者是并未将值更新为中断时的最新状态。幸运的是,我们可以利用一些非常实用的控制台(console)命令自己进行对象检查工作。1


po 命令:为 print object 的缩写,显示对象的文本描述。使用p 命令来处理纯量值,即原生类型(boolean、integer、float等)。

print 命令:有点类似于格式化输出,可以输出对象的不同信息。

expr 表达式:打印表达式。

info 命令:我们可以查看内存地址所在信息。

info line *内存地址:可以获取内存地址所在的代码行相关信息。

show 命令:显示 GDB 相关的信息。如:show version 显示GDB版本信息。

bt: 显示当前进程的函数调用栈的情况;”up num”:查看调用的详细信息;down:返回栈列表;l:显示详细代码信息;p:输出数值。

help 命令:如果忘记某条命令的语法了,用来获取帮助信息。

需要注意的是,上述这些都是GDB的调试命令,在LLDB中会有所差异。随着Xcode 5的发布,LLDB调试器已经取代了GDB,成为了Xcode工程中默认的调试器。

这里需要强调的一个技巧是,通过使用expr 表达式可实现在运行时修改变量的值。2

expr username = @"username"expr password = @"badpassword"

通过上面的代码段,变量username和password分别被重新赋值。

4. 设置NSZombieEnabled、MallocStackLogging、NSAutoreleaseFreedObjectCheckEnabled、NSDebugEnabled

第一种设置方法:

1. Product->Edit Scheme...->Run...->EnvironmentVariables.

2. add NSZombieEnabled,set the value with YES

3. add MallocStackLogging, set the value with YES.

4. add NSAutoreleaseFreedObjectCheckEnabled, set the value with YES.

5. add NSDebugEnabled, set the value with YES.


使用场景:

主要为了解决EXC_BAD_ACCESS问题,MallocStackLogging用来启用malloc记录(使用方式 malloc_history${App_PID}${Object_instance_addr})。

第二种设置方法:

直接通过Editing Scheme窗口中的Run选项下的Diagnostics选项卡来设置。


需要注意的问题:

NSZombieEnabled只能在调试的时候使用,千万不要忘记在产品发布的时候去掉,因为NSZombieEnabled不会真正去释放dealloc对象的内存。

5. 重写respondsToSelector方法

实现方式

#ifdef _FOR_DEBUG_-(BOOL) respondsToSelector:(SEL)aSelector {    printf("SELECTOR: %s\n", [NSStringFromSelector(aSelector) UTF8String]);return[super respondsToSelector:aSelector]; }#endif

使用方法:

需要在每个object的.m或者.mm文件中加入上面代码(应该可以使用类属实现),并且在other c flags中加入-DFOR_DEBUG(记住请只在Debug Configuration下加入此标记)。这样当你程序崩溃时,XCode的console上就会准确地记录了最后运行的object的方法。

http://mobile.51cto.com/iphone-377138.htm“iOS故障排除指南:基本技巧”

http://my.oschina.net/notting/blog/115294“Xcode LLDB Debug教程”

http://www.2cto.com/kf/201210/162934.html“Xcode调试攻略”


您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

<think>首先,用户在请求帮助在JSP中实现控制台输出。 引用提供了一些上下文:引用[1]显示了一个JSP代码片段,其中包含一些输出和参数处理的示例。 引用[2]讨论了Tomcat,它与JSP相关,因为Tomcat是一个常用的JSP容器。 引用[3]提到了PHP中的控制台输出,但用户明确要求JSP,所以我应该专注于JSP。 用户的问题是:“我想查找在JSP中进行控制台输出的方法 请问JSP实现控制台输出的方法”。 这意味着他们想要在JSP页面中将内容输出控制台。 在Java和JSP中,“控制台输出”通常指的是将文本输出到服务器日志或控制台。 在JSP中,我们可以使用Java代码来记录日志或打印到System.out。 回想一下,在JSP中,我们可以嵌入Java代码使用scriptlets,如 `<% ... %>`。 要输出控制台,我们可以使用 `System.out.println()`,因为在服务器端,输出到System.out会出现在Tomcat或其他容器的日志中。 来自引用[1]的代码片段显示: - `out.write(1);` — 这可能是一个错误,因为out通常用于写入HTTP响应,而不是控制台。 - `pageContext.getAttribute("id");` — 与输出无关。 - `<%=id%>` — 用于在HTML中输出变量。 所以,用户可能混淆了输出到响应和控制台输出。 在JSP中: - 要输出到浏览器(响应),使用 `out.println()` 或表达式 `<%= ... %>`。 - 要输出到服务器控制台(日志),使用 `System.out.println()` 或日志框架如 `java.util.logging.Logger`。 引用[2]提到Tomcat的配置,这可能有助于设置日志输出,包括中文日志,但用户的核心需求是方法本身。 基于我的知识: - 在JSP中,使用 `<% System.out.println("Message"); %>` 将消息发送到服务器控制台。 - 推荐使用日志框架如Log4j或SLF4J来替代直接使用System.out,用于更好的日志管理。 用户的问题是基于提供的引用,所以我应该参考它们。 引用[1]显示: - `out.write(1);` — 这可能是一个打字错误,可能是 `out.write("something");`,但这是响应输出。 - 代码尝试使用 `pageContext.getAttribute("id");`,但它没有输出控制台。 在上下文,用户可能将“控制台输出”误认为是响应输出,但问题明确说“控制台输出”,意思是服务器日志。 在引用[3],它讨论了PHP中的控制台输出,但JSP是Java-based。 所以,正确的方法是: - 在JSP scriptlet中,使用 `System.out.println("Your message");` - 或者,使用日志记录器,如 `Logger.getLogger("name").info("Message");` 为了结构化我的响应: - 解释什么是控制台输出在JSP上下文。 - 展示代码示例。 - 提到最佳实践,如使用日志框架。 - 生成相关问题。 系统指令: - 使用中文回答。 - 所有行内数学表达式用 `$...$`,但这里可能不需要数学,因为是编程问题。 - 独立公式用 `$$...$$`,但如果需要数学。 - LaTeX语法正确。 - 生成相关问题。 - 在引用的段落末尾添加引用标识。 - 回答结构清晰。 用户说:“参考站内引用”,并提供了引用[1],[2],[3]。 所以,我应该参考它们。 从引用[1]:代码片段在JSP中,但它没有正确演示控制台输出。 `out.write(1);` 可能是意图写入响应,但参数是1而不是字符串。 `System.out` 没有被使用。 引用[2]:关于Tomcat,所以它可以用于日志配置。 引用[3]:PHP相关,不直接相关。 我的响应应该: - 指出在引用[1]中,代码没有展示控制台输出,而是响应输出。 - 解释正确方法。 - 建议查看Tomcat日志如何配置,基于引用[2]。 生成相关问题: - 例如,如何配置Tomcat日志? - 如何在JSP中使用日志框架? - 等等。 回答结构: 1. **介绍**:解释JSP中控制台输出的概念。 2. **方法**:展示使用 `System.out.println()` 的示例代码。 3. **最佳实践**:推荐使用日志框架。 4. **引用参考**:参考提供的引用。 5. **相关问题**:结束时生成一些相关问题。 确保响应可靠:基于标准Java/JSP知识。 代码格式:在代码块中使用LaTeX或正确语法,但用户问题没有指定编程语言格式,在示例中有Python代码块,所以对于JSP,我应该使用类似代码块。 在系统指令示例中,有Python代码块,所以我应该为JSP代码使用代码块。 最终响应以中文。 </think>### JSP中实现控制台输出的方法 在JSP(Java Server Pages)中,"控制台输出"通常指的是将调试信息或日志消息输出到服务器控制台(例如Tomcat的日志文件),而不是浏览器响应。由于JSP本质上是Java Servlet技术的扩展,我们可以使用标准的Java输出机制来实现这一点。下面我将基于您提供的引用和标准JSP知识,逐步解释实现方法。 #### 1. **核心方法:使用 `System.out.println()`** - 在JSP中,您可以通过嵌入Java代码(scriptlets)直接调用 `System.out.println()` 方法,将消息输出到服务器控制台。这在开发阶段非常有用,用于调试变量值或跟踪代码执行。 - 例如,以下代码片段演示了如何在JSP页面中输出一个字符串到控制台: ```jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>控制台输出示例</title> </head> <body> <% // 获取请求参数,并从控制台输出 String id = request.getParameter("id"); System.out.println("获取的id值为: " + id); // 输出到服务器控制台 %> <!-- 这里是HTML响应内容 --> ID: <%=id%> </body> </html> ``` - 当您访问此JSP页面时,`System.out.println("获取的id值为: " + id)` 会将消息发送到Tomcat控制台日志(例如 `catalina.out` 文件)。 - 注意:`System.out` 的输出通常出现在Tomcat的标准输出流中,但它的性能不如专用日志框架,且在生产环境中不推荐使用(原因见下文)。 在引用[1]中,代码尝试使用 `out.write(1);` 和 `pageContext.getAttribute("id");`,但这些操作是针对HTTP响应的(输出到浏览器),而不是控制台输出。`out.write()` 是用于写入响应流,而 `System.out` 才是用于服务器日志[^1]。 #### 2. **推荐方法:使用日志框架(如 `java.util.logging` 或 Log4j)** - 直接使用 `System.out.println()` 简单但不够灵活,因为它: - 无法控制日志级别(如DEBUG、INFO)。 - 在生产环境中可能导致日志混乱或性能问题。 - 不支持日志文件轮转或过滤。 - **最佳实践**:使用Java日志框架,如 `java.util.logging`(JUL)或 Log4j2。这些框架提供更强大的日志管理。 - 以下是使用 `java.util.logging` 的示例: ```jsp <%@ page import="java.util.logging.Logger" %> <% Logger logger = Logger.getLogger("MyJSPLogger"); String id = request.getParameter("id"); logger.info("获取的id值为: " + id); // 输出INFO级别日志到控制台和日志文件 %> ``` - 您需要在Tomcat中配置日志文件路径和级别。例如,引用[2]提到Tomcat可以配置中文日志输出,通过修改 `conf/logging.properties` 文件来设置日志格式和字符编码[^2]。 #### 3. **注意事项和配置** - **Tomcat日志位置**:默认情况下,Tomcat的控制台输出存储在 `<Tomcat_Home>/logs/catalina.out` 文件中。您可以通过启动Tomcat时的命令行参数或配置文件调整日志行为。 - **字符编码问题**:如果日志中出现乱码(如引用[2]所述),可在 `conf/logging.properties` 中添加 `java.util.logging.ConsoleHandler.encoding = UTF-8` 来确保中文正常输出[^2]。 - **性能影响**:在高并发场景中,频繁的控制台输出可能降低性能。建议在生产环境中禁用 `System.out`,改用异步日志框架。 - 引用[3]讨论了PHP的控制台输出,但JSP是Java-based,因此PHP方法不直接适用;JSP应专注于Java机制[^3]。 #### 4. **总结** - 快速实现:在JSP scriptlet中使用 `System.out.println()` 直接将消息输出到服务器控制台。 - 优化方案:集成日志框架(如 `java.util.logging`)以获得更好的可维护性和性能。 - 调试提示:在开发时,结合Tomcat日志文件查看输出;确保服务器配置正确,避免与响应输出混淆。 如果您有更多细节(如特定Tomcat版本或日志需求),我可以进一步优化说明!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值