6 题: Xcode附加到进程不显示NSLog

在...创建的问题 Tue, Mar 17, 2015 12:00 AM

我刚开始使用Apple Watch。在获取iOS应用程序时,我发现了“ 五分钟Watchkit ”的说明手表套件应用程序都在模拟器中运行,并且两个进程都连接到LLDB调试器。

我所做的是启动并退出iOS应用以在SIM卡中安装当前版本。然后我切换到watchKit方案并启动它,在手表模拟器上显示我的手表应用程序UI。

然后我在模拟器中启动相应的iOS应用程序,然后用户在Xcode菜单中“附加到进程”,将调试器附加到正在运行的iOS应用程序。

这很有效。我可以在监视工具包InterfaceController或我的iOS应用程序中设置断点,调试器会在应用程序中断点。

但是,我没有在我的iOS应用程序的调试控制台中看到NSLog()语句。 (我确实看到来自WatchKit扩展代码的日志语句。)如果我在我的iOS应用程序中设置了一个断点,它确实会在该断点处停止。我假设NSLog缺少控制台输出有一些东西要附加到sim上的正在运行的进程而不是从Xcode启动它,但我不知道那是什么。

(顺便说一句,将一个动作附加到从断点调用NSLog的断点也不会显示,但是“日志消息”调试器命令会显示。 有没有人有任何见解?)

编辑: iOS应用程序中的代码似乎并不重要。就我而言,这是一个简单的IBAction,它附加在iOS应用程序故事板中的按钮上:

 
- (IBAction)buttonAction:(UIButton *)sender;
{
  NSLog(@"Button clicked on iPhone");
}

我可以在该NSLog语句上设置断点。调试器在该行停止,但我没有在调试控制台中看到日志语句。

    
22
  1. 你确定编译器得到了这么多吗?哦,请显示一些代码,这将是有用的
    2015-03-17 17:57:12Z
  2. Linus,我是积极的。调试器在包含NSLog的行中断。只是日志语句没有显示到控制台。
    2015-03-17 18:37:57Z
  3. 第三次,调试器停在相关行的断点处。我绝对是100%,确定连接是正确的。如果我在Xcode中使用⌘R启动iOS应用程序,则日志语句有效。只有当我在sim中运行应用程序然后附加到我的NSLog语句无法显示的正在运行的进程时。
    2015-03-17 18:55:50Z
  4. 将IBAction的参数类型更改为id正在为问题挥手致意,甚至不值得尝试。
    2015-03-17 18:56:54Z
  5. 2015-11-23 19:04:38Z
  6. 醇>
    6答案                              6 跨度>                         

    我可以用一个简单的测试应用程序重现它,没有WatchKit。该应用程序包含一个NSTimer,每秒打印“定时器触发”。 (此代码100%正确;)。手动连接到流程后,日志中没有显示任何内容 据我所知NSLog输出到stderr,我想附加调试器不会将stderr重定向到Xcode终端。

    如果您可以使用控制台应用程序或终端查看日志,则可以执行此操作。 iOS8将模拟器日志存储在~/Library/Logs/CoreSimulator/<Device-UUID>中。在此目录中,您将找到一个system.log,其中包含您的所有NSLog输出。

    您可以在终端(cat,grep,tail)中查看它,或在Console.app中打开它。


    Apple在技术说明TN2239中确认(至少对于GDB): iOS Debugging Magic

      

    控制台输出

         

    许多程序,实际上是许多系统框架,都打印调试   消息给stderr。此输出的目标是最终的   由程序控制:它可以将stderr重定向到任何东西   它选择的目的地。但是,在大多数情况下,程序不会   重定向stderr,因此输出转到默认目标   程序从其启动环境继承。这是   通常是以下之一:

         
    • 如果您启动GUI应用程序,因为它将由正常启动   用户,系统将stderr上打印的任何消息重定向到   系统日志。您可以使用所述技术查看这些消息   早。
    •   
    • 如果你在Xcode中运行一个程序,你可以看到它   在Xcode的调试器控制台窗口中输出stderr(选择控制台)   “运行”菜单中的菜单项可以看到此窗口)。
    •   

    附加到   运行程序(使用Xcode的Attach to Process菜单,或附加   GDB中的命令)不会自动将程序的stderr连接到   你的GDB窗口。你可以使用这个技巧从GDB中做到这一点   描述在“看到stdout和stderr After Attach”部分之后   技术说明TN2030,'GDB for MacsBug Veterans'。

    上述TN2030已无法在其服务器上使用(镜子)。它展示了如何将stdout和stderr重定向到Xcode控制台。但是,由于shell tty不是LLDB的有效命令,因此无济于事。但也许有一种不同的方式来访问tty Xcodes控制台使用,所以我附上了TN的重要部分。

      

    在附加后看到stdout和stderr

         

    如果您将GDB附加到进程(而不是启动进程)   从GDB内部,你将无法看到任何进程   打印到stdout或stderr。 Finder推出的程序通常是   有stdout和stderr连接到“/dev /console”,所以信息   他们打印到控制台。你可以通过启动来查看   然而,控制台应用程序(在Utilities文件夹中)是   不方便必须在一个单独的窗口看。另一种选择   是将进程的stdout或stderr连接到终端设备   对于GDB的终端窗口。清单9显示了如何执行此操作。

         

    清单9.将stdout和stderr连接到GDB的终端设备。

     
    (gdb) attach 795
    [... output omitted ...]
    (gdb) call (void) DebugPrintMenuList()
     No output )-:
    
     Close the stdout and stderr file descriptors.
    (gdb) call (void) close(1)
    (gdb) call (void) close(2)
    
     Determine the name of the terminal device for GDB itself.
    (gdb) shell tty
    /dev/ttyp1
    
     Reopen stdout and stderr, but connected to GDB's terminal.
     The function results should be 1 and 2; if not, something
     is horribly wrong.
    (gdb) call (int) open("/dev/ttyp1", 2, 0)
    $1 = 1
    (gdb) call (int) open("/dev/ttyp1", 2, 0)
    $2 = 2
    
     Try the DebugPrintMenuList again.
    (gdb) call (void) DebugPrintMenuList()
     Yay output!
    Index MenuRef     ID  Title
    ----- ---------- ---- -----
    <regular menus>
    00001 0x767725D3 -21629 Ed
    00002 0x76772627 1128 <Apple>
    00003 0x767726CF 1129 File
    00004 0x76772567 1130 Edit
    [... remaining output omitted ...]
    
        
    16
    2015-03-17 19:28:07Z
    1. 如果必须的话,我在控制台中查看我的日志输出是“好”,但它很糟糕。控制台非常嘈杂。系统进程不断向控制台发布对我毫无意义的消息。此外,Xcode调试控制台专为此而设计。它应该显示正在运行的程序的输出。启动应用程序是一个多步骤的过程:杀死手表应用程序,iOS应用程序,构建和运行iOS应用程序,杀死它,启动监视应用程序,在sim中启动iOS应用程序,将调试程序附加到iOS应用程序。这是一种痛苦,说实话。
      2015-03-17 19:10:10Z
    2. 我希望有更好的解决方案。如果不是,我会接受你的回答......
      2015-03-17 19:10:3​​2Z
    3. MacsBug?!?哦,男人,这可以追溯到LOOOOONNNG Way。当Macs使用68000系列处理器时,情况又回来了。我在80年代末和90年代在我的Mac II上使用过MacsBug。
      2015-03-17 19:29:41Z
    4. 我应该在FMW帖子中添加一个关于此的注释。 : - )
      2015-03-24 18:44:38Z
    5. 我想补充一点,如上所述,使用grep过滤很容易找到你的调试信息,所以你没有那个控制台噪音。
      2015-09-30 00:59:54Z
    6. 醇>

    要添加到Filipp Keks的答案,这里是一个比接受的答案更简单的方法的直观表示。

    来自Filipp Keks的回答: “1)插入设备并打开Xcode

    2)选择窗口 - &gt;菜单栏中的设备

    3)在左栏的DEVICES部分下,选择设备

    4)要查看设备控制台,请单击右侧面板左下角的向上三角形

    5)单击右下角的向下箭头将控制台保存为文件“

    此屏幕截图是在“设备”窗口的Xcode 7.3.1中进行的。

        
    9
    2016-06-21 19:55:05Z
    1. 我推荐它对Xcode 8.3.3的工作方式与我相同。必须记住,这是一个完整的调试日志,所以所有应用程序和服务都出现在那里,你必须从你的进程中找到它们。
      2017-10-30 08:37:25Z
    2. 如果你能过滤这些日志那么“更简单”..但ATM(xcode 9.2)你不能用这个UI做点什么。 (至少在现场会议中)。无论如何,我发现了一个github项目 deviceconsole ,它在shell中执行相同操作,允许您按原样进行过滤是(有点不稳定,有几次崩溃:()有没有人知道更好的项目?
      2018-04-17 17:50:19Z
    3. 醇>

    使用Xcode Version 7.2和iOS 9.2等,我发现了以下工作:

    0)杀死手机应用程序并观看应用程序
    1)选择Watch Extension Target并点击 Cmd + R (构建并运行)
    2)选择电话目标并点击 Ctrl + Cmd + R (无需建设运行)

    在我的情况下,我在他们的模拟器中有两个应用程序,并为两者获得NSLog输出。我不需要单独附加。希望这会有所帮助。

        
    5
    2016-01-22 01:18:25Z
    1. 我将不得不尝试这个。感谢您在相当老的帖子上发帖。
      2016-01-22 01:37:50Z
    2. 当我这样做时,它会停止我的手表应用程序并且手表会进入主屏幕。
      2016-07-21 16:24:18Z
    3. 醇>

    https://developer.apple.com/library/ios/QA /qa1747 /_index.html

    1)插入设备并打开Xcode

    2)选择窗口 - &gt;菜单栏中的设备

    3)在左栏的DEVICES部分下,选择设备

    4)要查看设备控制台,请单击右侧面板左下角的向上三角形

    5)单击右下角的向下箭头将控制台另存为文件

        
    3
    2016-05-10 14:55:41Z

    当您的配置文件设置为AdHoc或分发时,Xcode不显示日志,您需要设置开发以查看日志

        
    0
    2016-06-20 05:32:26Z

    在我的情况下,设置自动查看NSLog,之后根本不显示

        
    - 2
    2016-03-29 11:04:19Z
来源放置 这里