launchd can easily get into "weird" states.
load means to read the config file and potentially schedule a launch.
unload means to
stop and unschedule the config file
start will start the service (ignoring the schedule, I believe)
stop will stop the service (again, ignoring the schedule)
Generally if you want to "restart" it you unload and reload the config like this:
launchctl unload -w ~/Library/LaunchAgents/com.apple.myservice.plist
launchctl load -w ~/Library/LaunchAgents/com.apple.myservice.plist
-w means "write" which means that the change will affect reboots (will load every login or boot... or will not load ever again at login or boot).
If it's a system-level service (in
/Library/LaunchAgents you may need to do it with
sudo (and if you did it without sudo by mistake, you may need to unload it without sudo and then reload it with sudo)
The key in a file that causes it to
KeepAlive keeps it running if it dies for some reason)
It's sometimes tricky to get debug logging from launchctl itself, but the keys
StandardOutPath can at least help you know if your application is dying due to missing or bad information (an unexpanded environment variable or non-writable path, for example). Just be sure that the path you specify is writable by the user running the process.
Because they're so hard to debug, I'd recommend using LaunchControl or launched and mix that with a healthy reading of launchd.info.
Also, there are a number of debugging hints here:
I haven't tried it yet myself, but this solution looks the simplest:
sudo launchctl log level debug
tail -f /var/log/system.log