| Index: tools/task_kill.py
|
| diff --git a/tools/task_kill.py b/tools/task_kill.py
|
| index ab07e8a7b0e5d8ca81db012d51b19c2ccb09c47a..ed8b55521bfc73a265367dedb9ea4d9e3305fb33 100755
|
| --- a/tools/task_kill.py
|
| +++ b/tools/task_kill.py
|
| @@ -63,6 +63,12 @@ INFO_COMMAND = {
|
| 'linux': POSIX_INFO,
|
| }
|
|
|
| +STACK_INFO_COMMAND = {
|
| + 'win32': None,
|
| + 'macos': '/usr/bin/sample %s 1 4000 -mayDie',
|
| + 'linux': '/usr/bin/eu-stack -p %s',
|
| +}
|
| +
|
| def GetOptions():
|
| parser = optparse.OptionParser("usage: %prog [options]")
|
| parser.add_option("--kill_dart", default=True,
|
| @@ -124,7 +130,26 @@ def GetPids(process_name):
|
| else:
|
| return GetPidsPosix(process_name)
|
|
|
| -def PrintPidInfo(pid):
|
| +def PrintPidStackInfo(pid):
|
| + command_pattern = STACK_INFO_COMMAND.get(os_name, False)
|
| + if command_pattern:
|
| + p = subprocess.Popen(command_pattern % pid,
|
| + stdout=subprocess.PIPE,
|
| + stderr=subprocess.PIPE,
|
| + shell=True)
|
| + stdout, stderr = p.communicate()
|
| + stdout = stdout.splitlines()
|
| + stderr = stderr.splitlines()
|
| +
|
| + print " Stack:"
|
| + for line in stdout:
|
| + print " %s" % line
|
| + if stderr:
|
| + print " Stack (stderr):"
|
| + for line in stderr:
|
| + print " %s" % line
|
| +
|
| +def PrintPidInfo(pid, dump_stacks):
|
| # We assume that the list command will return lines in the format:
|
| # EXECUTABLE_PATH ARGS
|
| # There may be blank strings in the output
|
| @@ -137,13 +162,15 @@ def PrintPidInfo(pid):
|
|
|
| # Pop the header
|
| lines.pop(0)
|
| +
|
| + print "Hanging process info:"
|
| + print " PID: %s" % pid
|
| for line in lines:
|
| # wmic will output a bunch of empty strings, we ignore these
|
| - if len(line) >= 1:
|
| - print("Hanging process info:")
|
| - print(" PID: %s" % pid)
|
| - print(" Command line: %s" % line)
|
| + if line: print " Command line: %s" % line
|
|
|
| + if dump_stacks:
|
| + PrintPidStackInfo(pid)
|
|
|
| def KillPosix(pid):
|
| try:
|
| @@ -161,14 +188,14 @@ def KillWindows(pid):
|
| shell=True)
|
| p.communicate()
|
|
|
| -def Kill(name):
|
| +def Kill(name, dump_stacks=False):
|
| if name not in EXECUTABLE_NAMES[os_name]:
|
| return 0
|
| print("***************** Killing %s *****************" % name)
|
| platform_name = EXECUTABLE_NAMES[os_name][name]
|
| pids = GetPids(platform_name)
|
| for pid in pids:
|
| - PrintPidInfo(pid)
|
| + PrintPidInfo(pid, dump_stacks)
|
| if os_name == "win32":
|
| KillWindows(pid)
|
| else:
|
| @@ -194,7 +221,7 @@ def KillVCSystems():
|
| return status
|
|
|
| def KillDart():
|
| - status = Kill("dart")
|
| + status = Kill("dart", dump_stacks=True)
|
| return status
|
|
|
| def KillFletch():
|
|
|