Where is stdout for a Mac App? - macos

It used to be that stdout went to the console log, displayed by Console.app. I've been having some problems with a firefox plugin (see other questions, sorry about the spam...) and I was trying to use printfs to at least see if I was STARTING my plugin.
I just noticed today that my console log hasn't been updated since January 6. (Yes, I've been using the machine for the past month.) Now, I'm not the only program that uses the console log, so all those messages must be going SOMEWHERE else.
Does anyone know where?
The problem was that syslogd was broken. It's fixed now.

Solution: the problem wasn't that stdout wasn't going to the console. The problem was that the console wasn't getting written to because syslogd was buggered. Syslogd was being sandboxed for some reason, and so NOTHING had been written to the console since January 6.
the solution was to re-comment out the "uncomment this if you want to sandbox syslogd" section of LaunchDaemons/com.apple.syslogd.plist.
The solution came from superuser.com....
thanks!

printf should be going to the Console.app. It sounds like yours is broken.
A good way to debug your plugin would be to set FireFox as your XCode project's Custom Executable, and run in the debugger. Then the XCode Console would catch the output.
In that case you also just use a breakpoint to see if your plugin was loading instead of printf.

After starting an app and running "lsof | grep <program_name>" it shows file descriptors 0, 1 and 2 are all /dev/null

Related

macOS: How to redirect STDERR / STDOUT of a process AFTER started, using Terminal?

In macOS one can normally get some appreciable console / shell output by executing a process by executing it's binary directly in the Terminal via:
/Applications/SOME_APPLICATION.app/Contents/MacOS/SOME_APPLICATION
This can be very useful from time to time for debugging and catching errors that occur. With the introduction of Catalina (10.15), direct execution of applications in this fashion is discouraged from scripts, etc. and causes various problems, ultimately requiring the use of /usr/bin/open.
How can we redirect STDERR / STDOUT of a process after it's been started?
There has been some discussion on this topic previously for Linux, but it's not clear as to whether some of this will work out for macOS now.
reptyr would be fantastic if it could be repurposed for macOS since it already works mostly for FreeBSD.
This answer is from 2013 but is mostly still relevant.
Prior to Mountain Lion, all processes managed by launchd, including
regular applications, had their stdout and stderr file descriptors
forwarded to the system log. In Mountain Lion and above, stdout and
stderr go nowhere for launchd managed applications. Only messages
explicitly sent to the system log will end up there.
If you're writing an application and would like some output to show up
in the console, then adopt an API built on syslog(3) or asl(3)
instead. NSLog is one such API, and it has the advantage of logging to
stderr too so you can easily see your output no matter how you've
launched your application. If you'd like that functionality but want
to use asl or syslog directly then you'll want to look in to the
ASL_OPT_STDERR option to asl_open, and the LOG_PERROR option to
openlog respectively.
Basically, when you double-click an app (same as /usr/bin/open) there is no stdout/stderr. The dev is expected to send any relevant output/errors to the available logging APIs such as NSLog.

how to get stdout into Console.app

Earlier, I could read all stdout/stderr data from applications in Console.app. Since a while, this is not the case anymore (NSLog data is still there, though). I'm on 10.8 now.
There was an earlier similar question from 2010 which doesn't seem up-to-date anymore.
On SU, there is also a similar question which wasn't yet answered.
Has that been changed, i.e. stdout is not supposed to be logged anymore? Or is something broken on my system (from the old SU question, it sounded like that might be the case - although without being helpful)?
Can I somehow change it back?
Prior to Mountain Lion, all processes managed by launchd, including regular applications, had their stdout and stderr file descriptors forwarded to the system log. In Mountain Lion and above, stdout and stderr go nowhere for launchd managed applications. Only messages explicitly sent to the system log will end up there.
If you're writing an application and would like some output to show up in the console, then adopt an API built on syslog(3) or asl(3) instead. NSLog is one such API, and it has the advantage of logging to stderr too so you can easily see your output no matter how you've launched your application. If you'd like that functionality but want to use asl or syslog directly then you'll want to look in to the ASL_OPT_STDERR option to asl_open, and the LOG_PERROR option to openlog respectively.
If you have an old app and want to see stdout or stderr, open the app from Terminal. You can wind your way to the executable and open it from the command line, like in the normal, old world: type the program name. Then the messages will appear on the terminal.
This is not a repudiation of any of the other, better suggestions. It is just a way to get the output without altering the (old) program.

Console output from a browser plugin Mac OS X?

How can I put log statements into a browser plugin written for Mac OS X so that I can see them when the plugin is running?
Any printf you put in your browser plugin will eventually show up in the "console" application; however, recently that seems to take longer and longer and sometimes doesn't end up showing up at all.
I personally recommend logging to a file; the FireBreath project has built-in support for log4cplus so a lot of us use that, but there are plenty of logging statements.
Still, even just a printf will usually be visible if you look in the right place -- and that's the system log, which you can view by running Console.app (in Applications/Utilities)

Couldn't register with the bootstrap Server

I just changed some code in my program and got this error:
Couldn't register com.yourcompany.XXX with the bootstrap server.
Error: unknown error code.
This generally means that another instance of this process was already
running or is hung in the debugger.Program received signal:
“SIGABRT”.
I tried restoring my program to a version that worked, rebooted, restarted, empty caches and rebuild on versions that even worked before.
Any help would be appreciated.
I was able to recover from this by unplugging the iPad, powering it down and back up, clearing all XCode caches and targets, and doing a clean build.
I'm running XCode 3.5.4 and iOS 4.2.1
UPDATE: Same problem running Xcode 4.3 and iOS5 - just power-cycle the device.
You might wish to kill all Simulator processes, that can cause this error as well.
Here's a one-liner to kill 'em all:
kill -9 `ps ax | grep Simulator | grep -v grep | awk '{print $1}'`
Or more concise, like #brianegge mentions as a comment:
killall -9 Simulator
My solution was to restart the ipad, wait a while and try again.
If you get the hang when using the simulator, look at this thread: Strange Error When Testing Simulator
You may find this test of interest, as it will tell you ASAP if the only solution is to reboot now or not:
Open Terminal and run this command: ps -Ael | grep Z. If you get two entries, one "(clang)" and the other your app or company name, you're hosed - reboot.
If you are a developer, enter a short bug and tell Apple how absolutely annoying having to reboot is, and mention they can dup this bug to "rdar://10401934" .
I received the same problem, running an app on an iPhone from Xcode. The message that I was getting was the same as above:
Couldn't register xxx.com.company.appname with
the bootstrap server. This generally
means that another instance of this
process was already running or is hung
in the debugger.
I tried many things to fix the problem, in this order, all which failed:
force quitting the app on the iPhone
force quitting and then deleting the app the iPhone
opening and closing the project
cleaning the project
restarting XCode
Eventually, I rebooted the iPhone and the problem went away, which leads me to think that the source of the problem is a hung process that Xcode cannot or will not kill. If I am able to reproduce exactly what I was doing during my debugging session to get this strange state I'll add another note here.
I opened a bug report with Apple: https://bugreport.apple.com/cgi-bin/WebObjects/RadarWeb.woa/19/wo/WBbbbyopNFW8FFUuNSbk0w/10.66
Please let me know if you can't access it.
Summary: XCode debugger is not releasing bootstrap server port
Steps to Reproduce:
While debugging an iPhone iOS5 app in the simulator in Xcode 4.2 Build 4D5163b on Lion 10.7.2, a crash can sometimes result in being unable to start the bugger. Instead, Xcode produces this error:
Couldn't register com.MyApp.MyApp with the bootstrap server.
Error: unknown error code. This generally means that another instance
of this process was already running or is hung in the debugger.Program
received signal: “SIGABRT”.
Expected Results:
Should be able to start debugger after a crash.
Actual Results:
Cannot start debugger. The only way I've discovered to make the simulator work again is to restart Mac OS.
Regression:
Notes:
Lots of people are having this problem:
iPhone - strange error when testing on simulator
Couldn't register with the bootstrap Server
Bootstrap Server Error in Xcode IPHONE
https://discussions.apple.com/message/10416765?messageID=10416765
Quitting XCode and the Simulator (& ensuring ps -Al | egrep "Xcode|Simulator" returns nothing) does not help the problem.
Running "launchtl bslist | grep MyApp" reveals that com.MyApp is still registered with the bootstrap server:
$ launchctl bslist | grep MyApp
A com.MyApp.MyApp.UIKit.migserver
A com.MyApp.MyApp
I wrote some code to find the port and invalidate it, but this too fails:
NSMachBootstrapServer *bsserver = [NSMachBootstrapServer sharedInstance];
NSMachPort *port = (NSMachPort *)[bsserver portForName:#"com.MyApp.MyApp"];
[port removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:<#(NSString *)#>
NSLog(#"port = %#",port);
NSLog(#"port.isValid=%d",[port isValid]);
[port invalidate];
NSLog(#"port.isValid=%d",[port isValid]);
I got the same issue with Xcode 4. The solution was to change the scheme.
Run set to Debug,
Test set to Debug,
Profile set to Release,
Analyze set to Debug,
Archive set to Release
Restarting my computer solved my problem. This error happened when I connected my new iPod Touch to my mac and ran my project in simulator at the same time.
The easiest way its to change the target name,
Remembert to change it back next day after a restart.
To sum it all up.
Sometimes kill -9 (the process id) helps.
Sometimes (as stated) launchctl list | grep UIKitApplication | grep "(your app name/identifier)" | awk '{print $3}' | xargs launchctl remove works.
But if its a "zombie" process, only a restart will solve your problem.
A temporary solution is to just change the identifier (IOS Application Target, Summary Tab) to something else (like "com.mycompany1.myapp" from "com.mycompany.myapp") but remember to change it back after the reboot and before you submit it.
(of course this will create another app on the simulator, but I guess that's the least of your problems....)
Unfortunately, there is no "easy way to greatness"... ;-)
Here is how I think I solved this 'strange' error:
Couldn't register com.yourcompany.XXX with the bootstrap server. Error: unknown error code.
This generally means that another instance of this process was already running or is hung in the debugger.Program received signal: “SIGABRT”.
(1) Clean all the caches, targets, headers on both Xcode and the simulator.
(2) Restart your iPhone when it is not connected to the computer and make sure no versions of the program that gave you problems are left on your iPhone.
(3) Restore any previous version of your program that you know absolutely worked at one point in time.
(4) Shut down your computer/laptop. (I needed to do it 4 times.) Makes no sense to me.
(5) Restart your machine and try running a different program to see if you still get the error. If you do not get the error on another program.
(6) Compile the program that gave you the error:(1) First with an earlier version that worked. And then, the version that gave you the error. Naturally, you may have to re-add code on a step-wise basis to make sure you know what code caused the error.
This happened to me because another application was eating up the computer's resources. I quit the simulator, quit the application which was hanging my computer and restarted the simulator, and it worked then. The error means that a previously killed process couldn't reach the end of the queue, and is holding up the current one.
Lot's of good answers have been provided for fixing the problem.
I have found that I can recreate this bug by creating a breakpoint in my code so that the execution pauses. Then if I press on the Stop Button the bug will now appear when I try to run the code again. Resuming the execution before pressing the Stop Button therefore avoids this issue.
Hope this helps.
closing down xcode then starting it, and restarting my iphone solved my problem
I didn't find a better solution than mentioned above: restart the iPhone. It seems that there's a daemon that connects to the Xcode debugger not properly killed.
You can avoid this behavior ALWAYS stopping the debugging session through the "Stop" button in Xcode, and waiting for the app to exit automatically on the iPhone. I always have to reboot if I click "Start" without stopping first, or exiting with the iPhone's button, or something like that. Hope it helps
I encountered this issue myself just now while evaluating AppCode. I discovered that XCode had somehow attached itself to my application while I was attempting to attach AppCode to my application. I simply stopped the XCode debug session and it worked as expected. I hope this will help somebody.
Just rebooting the device should solve the problem. See the analogous question about the simulator: iPhone - strange error when testing on simulator
This may be caused by an instance of your app running in the background. This simplified process worked for me without even having to close xCode or shutdown my computer.
Close simulator
Stop the app from running in xCode.
Open activity monitor and search for a process running with your App NAME.
Kill this process in Activity Monitor
Rebuild your project and you should be all set
In theory Pål's command line solution should work as well. The issue definitely seems to be caused by an extra instance of the app running in the background. The app does not always seem to be getting killed properly after each test in simulator or on the device. I first noticed this when jumping between simulator and a device frequently.
As a preventive measure it is good practice to always hit the stop button in xCode after each test.
Very interesting results when trying to restart my computer. It said, and this is no joke, that 103 users where "sharing" the system. When I restarted, it back down to the usual four (I have Time Machine stuff for all of my computers going through this computer). I stopped the problem by simply setting up an app that monitors that activity, and does not allow additional users to "share" my computer without my permission. What it does is create a window every time someone wants access, and I have to press "Approve" before they can get in. This didn't work properly until I made the changes below.
I made sure it would tell me when somebody stopped sharing. Whenever Xcode has this problem, I know long before it returns the errors.
This is now useful for almost everything, but annoying during gaming of any kind.
I then wrote a script that fixed the problem by, basically, clearing the Simulator processes that might possible cause problems.
This app will be very useful to developers, so I am "polishing" it up a bit, then it is off to the App Store. When it gets to that point, I will post a link to it here (it will be free).
Okay, I've got a workaround for the hardware issue that doesn't involve rebooting the phone. I assume this will also work on the simulator but I haven't tried it.
Force Springboard to relaunch by changing the language. Settings -> General -> International -> Language.
I just changed it to Spanish, waited for Springboard to relaunch, changed it back to English, and was good to go.
This evening I got the same issue saying
"Couldn't register com.xxx.yyy with the bootstrap server. Error:
unknown error code.
This generally means that another instance of this process was already
running or is hung in the debugger.(lldb)"
and I got solved
1.Just disconnect my Device (for me its iPhone) from Xcode/ Mac machine
2.Reboot the Device (my iPhone)
3.Removed previously installed/corrupted app
4.Again connect device and started exception
It works well
Hope this will help someone there.

get console log on MacOSX from another application

With the application Utilities/Console.app, I can see the console output of applications.
Is there a way to access this log from another application?
To be more specific: I am writing a crashhandler for my application and I want that it attaches the console output to the crash information.
Ah, just found out that there is the file /var/log/system.log which contains those information.
/var/log/system.log was not really a solution because the output didn't immediatly appeared there (which was a big problem because how should my crash handler know that everything is complete there), also the grepping of the related messages was very hackish and then, when I started several instances of the application, I didn't really know about the correct related output (unless I knew the pid but even then, also the pid is not unique).
Know, a solution I am very happy with, is that the application itself is keeping track about all the console output. It is doing that by forking itself and piping its output to the fork and emulating the tee tool there, where one output is a special log file. When it crashes, it sends the filename of the logfile to the crashhandler.
If you are interested, look at the OpenLieroX source code ( http://sourceforge.net/projects/openlierox ).

Resources