gdbdump 0.9.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 806c8f4485ae5cfad83522a88e00ea3a625d7ed5
4
- data.tar.gz: a125ef9b802bb4cece94f042a11340a3ca862296
3
+ metadata.gz: 589c4ae8d652fe1c24deb76f73deea5ba82ec242
4
+ data.tar.gz: 2689d144842a157d13168a70c28adcce61a5e78d
5
5
  SHA512:
6
- metadata.gz: 2e9373b1893dac6dad697b3eb95dca41e0f43d64b2400e136e9387850755152474e472e0c5038a1ee181e180dfb4e3e8d0bbb7d365bf263a8c2b973cc4e405e0
7
- data.tar.gz: f2eb578d9859bbccd7149156bba3e1a35dcedb70dab66915597c6bbea807492c426e3da7b076d7588b8776f0c4c79c7bc9a51b01a3d77a6542ee5246c6031615
6
+ metadata.gz: 5923cc6b4353b49039095e8440401b92645e6080dd95bc5c45a46804ed649f2cdc3e280a3fbef2f9f3b1759ce32a4dd7c0fc9e6061fbfe7c37ad6dcb4aaabc55
7
+ data.tar.gz: 12dd18e4ca417c9d108767aa13f43d39aea3d69d477017ea19c1e91140b1a3af00fcdc2ff88b338ca6854b0256f6fd996dfecdafbae1d66859460a59a4b1c153
data/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ # 0.9.1
2
+
3
+ Enhancements:
4
+
5
+ * Get ruby version from `ruby -e 'puts RUBY_VERSION'` instead of `strings ruby | grep RUBY_VERSION` so that I do not need to assume `strings` command is available
6
+
7
+ Changes:
8
+
9
+ * Add `--ruby` option instead of `[prog pid]` argument style.
10
+
1
11
  # 0.9.0
2
12
 
3
13
  Enhancements:
data/README.md CHANGED
@@ -19,10 +19,11 @@ It was verfied that gdbdump works with ruby executables built by [rbenv/ruby-bui
19
19
  ## Usage
20
20
 
21
21
  ```
22
- Usage: gdbdump [options] [pid|prog pid]
23
- -d, --[no-]debug print debug log (default: false)
24
- -x, --gdbinit FILE path to ruby trunk's .gdbinit (default: some of ruby trunk's .gdbinit is bundle in this gem, and used})
25
- --gdb PATH path to gdb command (default: gdb)
22
+ Usage: gdbdump [options] pid
23
+ -d, --[no-]debug print debug log (default: false)
24
+ -x, --gdbinit FILE path to ruby trunk's .gdbinit (default: some of ruby trunk's .gdbinit is pre-bundle in this gem)
25
+ --gdb PATH path to gdb command (default: gdb)
26
+ --ruby PATH path to ruby which the attached process uses (default: get from /proc/[PID]/exe)
26
27
  ```
27
28
 
28
29
  ### .gdbinit
@@ -43,7 +44,7 @@ With living ruby 2.4.1 process of pid 1897,
43
44
  $ gdbdump 1897
44
45
  ```
45
46
 
46
- You will see C and Ruby level backtrace on STDERR of **the target process** of pid 1897 as:
47
+ You will see C and Ruby level backtrace as:
47
48
 
48
49
  ```
49
50
  $1 = (rb_vm_t *) 0x7f46bb071f20
@@ -64,11 +65,10 @@ loop.rb:11:in `block in <main>'
64
65
 
65
66
  ## FAQ
66
67
 
67
- Q. How this work?
68
- A. Attach to the ruby process with gdb, and call `rb_ps` defined in gdbinit. That's it.
69
-
70
- Q. Is this available for production process?
71
- A. GDB stops the process during printing backtrace, would cause some issues
68
+ * Q. How this work?
69
+ * A. Attach to the ruby process with gdb, and call `rb_ps` defined in gdbinit. That's it.
70
+ * Q. Is this available for production process?
71
+ * A. GDB stops the process during printing backtrace, would cause some issues
72
72
 
73
73
  ## Comparisons
74
74
 
@@ -77,9 +77,11 @@ A. GDB stops the process during printing backtrace, would cause some issues
77
77
  * [sigdump](https://github.com/frsyuki/sigdump)
78
78
  * sigdump enables to print ruby level backtrace with sending CONT signal to living ruby process.
79
79
  * The ruby process must pre-install `sigdump` gem and `require 'sigdump/setup'` unlike gdbdump.
80
+ * sigdump prints backtrace in signal handler, so blocks main thread, but other threads still work unlike gdbdump.
80
81
  * [gdbruby](https://github.com/gunyarakun/gdbruby)
81
82
  * gdbruby enables to print C level and ruby level backtrace of living ruby process and core file.
82
83
  * gdbruby must follow changes of C level interfaces of CRuby to get backtrace of the core file, it rises fragility that it will be broken on newer ruby versions.
84
+ * gdbruby stops the process during printing backtrace as gdbdump, but it supports also core file. Using `gcore` command to get core file, it would be possible to analyze without stopping the process.
83
85
 
84
86
  ## Development
85
87
 
data/lib/gdbdump/cli.rb CHANGED
@@ -18,19 +18,23 @@ class Gdbdump
18
18
  debug: false,
19
19
  gdbinit: nil,
20
20
  gdb: nil,
21
+ ruby: nil,
21
22
  }
22
23
 
23
24
  op.on('-d', '--[no-]debug', "print debug log (default: #{opts[:debug]})") {|v|
24
25
  opts[:debug] = v
25
26
  }
26
- op.on('-x', '--gdbinit FILE', "path to ruby trunk's .gdbinit (default: some of ruby trunk's .gdbinit is bundle in this gem, and used})") {|v|
27
+ op.on('-x', '--gdbinit FILE', "path to ruby trunk's .gdbinit (default: some of ruby trunk's .gdbinit is pre-bundle in this gem)") {|v|
27
28
  opts[:gdbinit] = v
28
29
  }
29
30
  op.on('--gdb PATH', "path to gdb command (default: gdb)") {|v|
30
31
  opts[:gdb] = v
31
32
  }
33
+ op.on('--ruby PATH', "path to ruby which the attached process uses (default: get from /proc/[PID]/exe)") {|v|
34
+ opts[:ruby] = v
35
+ }
32
36
 
33
- op.banner += ' [pid|prog pid]'
37
+ op.banner += ' pid'
34
38
  begin
35
39
  args = op.parse(argv)
36
40
  rescue OptionParser::InvalidOption => e
@@ -39,11 +43,8 @@ class Gdbdump
39
43
 
40
44
  if args.size == 1
41
45
  @pid = args.first
42
- @prog = Gdbdump::Procfs.new(@pid).exe
43
- elsif args.size == 2
44
- @prog, @pid = args
45
46
  else
46
- usage 'number of arguments must be 1 or 2'
47
+ usage 'number of arguments must be 1'
47
48
  end
48
49
 
49
50
  @opts = opts
@@ -51,7 +52,7 @@ class Gdbdump
51
52
 
52
53
  def run
53
54
  parse_options
54
- GDB.new(pid: @pid, prog: @prog, **(@opts)).print_backtrace
55
+ GDB.new(pid: @pid, **(@opts)).print_backtrace
55
56
  end
56
57
  end
57
58
  end
data/lib/gdbdump/gdb.rb CHANGED
@@ -2,21 +2,21 @@
2
2
  require 'open3'
3
3
 
4
4
  class Gdbdump
5
- # GDB.new(pid: 999, prog: '/path/to/ruby', debug: true).run do |gdb|
5
+ # GDB.new(pid: 999, debug: true).run do |gdb|
6
6
  # puts gdb.cmd_exec('bt')
7
7
  # end
8
8
  class GDB
9
9
  COMMAND_READ_BUFFER_SIZE = 1024
10
- STRINGS_CMD = 'strings'
11
10
  SUDO_CMD = 'sudo'
12
11
 
13
- def initialize(pid:, prog: nil, debug: false, gdbinit: nil, gdb: nil)
12
+ def initialize(pid:, debug: false, gdbinit: nil, gdb: nil, ruby: nil)
14
13
  @pid = pid.to_s
15
- @prog = prog
16
14
  @debug = debug
17
- @gdbinit = gdbinit || File.join(ROOT, 'vendor', 'ruby', ruby_version, 'gdbinit')
18
15
  @gdb = gdb || 'gdb'
19
- @exec_options = [SUDO_CMD, @gdb, '-silent', '-nw', '-x', @gdbinit, @prog, @pid]
16
+ @ruby = ruby || Procfs.new(@pid).exe
17
+ @ruby_version = `#{@ruby} -e 'puts RUBY_VERSION'`.chomp
18
+ @gdbinit = gdbinit || File.join(ROOT, 'vendor', 'ruby', @ruby_version, 'gdbinit')
19
+ @exec_options = [SUDO_CMD, @gdb, '-silent', '-nw', '-x', @gdbinit, @ruby, @pid]
20
20
  end
21
21
 
22
22
  def print_backtrace
@@ -50,15 +50,6 @@ class Gdbdump
50
50
  end
51
51
  end
52
52
 
53
- # ToDo: Any faster way to get ruby_version from pid?
54
- # NOTE: I want ruby_version before starting gdb
55
- def ruby_version
56
- return @ruby_version if @ruby_version
57
- ret = `#{STRINGS_CMD} #{@prog}`
58
- line = ret.lines.find {|_| _.start_with?('RUBY_VERSION "') }
59
- @ruby_version = line[14..-3] if line
60
- end
61
-
62
53
  def cmd_exec(cmd)
63
54
  log('C', cmd)
64
55
  if cmd
@@ -1,3 +1,3 @@
1
1
  class Gdbdump
2
- VERSION = "0.9.0"
2
+ VERSION = "0.9.1"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gdbdump
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Naotoshi Seo