1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)# Copyright 2013 The Chromium Authors. All rights reserved.
2a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
3a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)# found in the LICENSE file.
4a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import os
6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import cr
8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class GdbDebugger(cr.Debugger):
11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  """An implementation of cr.Debugger that launches gdb."""
12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DETECTED = cr.Config('DETECTED')
14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  @property
16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def enabled(self):
17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return (cr.LinuxPlatform.GetInstance().is_active and
18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            self.DETECTED.Find('CR_GDB'))
19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  def Invoke(self, targets, arguments):
21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    for target in targets:
22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      with target:
23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        cr.Host.Execute(
24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            '{CR_GDB}', '--eval-command=run', '--args',
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            '{CR_BINARY}',
26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            '{CR_RUN_ARGUMENTS}',
27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            *arguments
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      )
29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  def Attach(self, targets, arguments):
31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    raise NotImplementedError('Attach not currently supported for gdb.')
32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  @classmethod
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  def ClassInit(cls):
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    # Attempt to find a valid gdb on the path.
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gdb_binaries = cr.Host.SearchPath('gdb')
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if gdb_binaries:
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      cls.DETECTED.Set(CR_GDB=gdb_binaries[0])
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
40