grpc-native-debug 1.60.0.pre1-x86-linux

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 9c263f6a3e982f9a5dc93b52c4ebe1c6f44669a5f6e9ee2dae3805cfefe0fbcb
4
+ data.tar.gz: ba25d5c93ae9d435cf86dfaf55d8b19e0947296447598b6c001ae5e18f7af724
5
+ SHA512:
6
+ metadata.gz: 1c8726a894114c3d06a52e3614e189783d03175e313f9ac32f7663fdb6a20a68816a896784a0a48dcf26ab51b8160a9c7c88cd8d43f06807f1baf0cf4fcc8c25
7
+ data.tar.gz: f59c9ed0e08de8828c880f9fa1c6ffea782ee98d6530887596158e7a787ea38651121fbd19f4eb8a3ea525f14c66f47198fcacdc341fb60f9f302996550b6fac
data/README.md ADDED
@@ -0,0 +1,230 @@
1
+ This package contains debug symbols that can be useful for debugging
2
+ applications that use grpc pre-compiled binary gems.
3
+
4
+ An example of a pre-compiled binary gem is `grpc-1.58.0-x86_64-linux.gem`
5
+ (as opposed to a source-built gem like `grpc-1.58.0.gem`).
6
+
7
+ `grpc-native-debug` gems contain debug symbols which complement the
8
+ native libraries in these grpc binary gems. After fetching and unpacking a
9
+ proper `grpc-native-debug` gem, one can load the correct `.dbg` symbol file to
10
+ debug their grpc application.
11
+
12
+ # Background
13
+
14
+ grpc-ruby pre-compiled binary gems are *released with debug symbols stripped*.
15
+ As a consequence, if you are to examine a grpc stack trace in a debugger
16
+ for example, a lot of information will initially be missing.
17
+
18
+ # Using grpc-native-debug
19
+
20
+ ## Finding the correct grpc-native-debug gem
21
+
22
+ Each `grpc-native-debug` gem is *one-to-one* with a `grpc` gem. Specifically:
23
+
24
+ - The version of a `grpc-native-debug` gem **must match the version** of the `grpc`
25
+ gem.
26
+
27
+ - The ruby platform of a `grpc-native-debug` gem **must match the ruby platform** of
28
+ the `grpc` gem.
29
+
30
+ So for example, if you are debugging `grpc-1.60.1-x86_64-linux.gem`, then you
31
+ need to fetch `grpc-native-debug-1.60.1-x86_64-linux.gem`.
32
+
33
+ ## Finding the correct .dbg symbol file
34
+
35
+ Each `grpc-native-debug` gem has a top-level `symbols` directory containing
36
+ symbol files ending in `.dbg`.
37
+
38
+ `grpc` binary gems are shipped with multiple native libraries. There is one
39
+ native library for each supported *minor version* of ruby. As such,
40
+ `grpc-native-debug` gems have exactly one `.dbg` file for each native library
41
+ in the corresponding `grpc` gem.
42
+
43
+ If you unpack a `grpc-native-debug` gem and look at the `symbols`
44
+ directory, you might see something like this:
45
+
46
+ ```
47
+ grpc-native-debug-1.60.1-x86_64-linux/symbols/grpc-1.60.1-x86_64-linux-ruby-3.0.dbg
48
+ grpc-native-debug-1.60.1-x86_64-linux/symbols/grpc-1.60.1-x86_64-linux-ruby-2.7.dbg
49
+ grpc-native-debug-1.60.1-x86_64-linux/symbols/grpc-1.60.1-x86_64-linux-ruby-3.2.dbg
50
+ grpc-native-debug-1.60.1-x86_64-linux/symbols/grpc-1.60.1-x86_64-linux-ruby-3.1.dbg
51
+ ```
52
+
53
+ In each of these `.dbg` files, the `ruby-<major>-<minor>` portion of the string
54
+ indicates which ruby version it's supposed to be used with.
55
+
56
+ So for example, if you are debugging `grpc-1.60.1-x86_64-linux.gem` on ruby-3.0, then you
57
+ need to use symbol file
58
+ `grpc-native-debug-1.60.1-x86_64-linux/symbols/grpc-1.60.1-x86_64-linux-ruby-3.0.dbg`.
59
+
60
+ ## Putting symbols into action (example gdb workflow)
61
+
62
+ There are a variety of ways to use these symbols.
63
+
64
+ As a toy example, suppose we are running an application under gdb using:
65
+
66
+ - ruby-3.0
67
+
68
+ - grpc-1.60.1.x86_64-linux.gem
69
+
70
+ At first, in gdb we might dump a grpc-ruby stack trace looking
71
+ something like this:
72
+
73
+ ```
74
+ (gdb) bt
75
+ #0 0x00007ffff7926e56 in epoll_wait (epfd=5, events=0x7ffff3cb4144, maxevents=100, timeout=-1) at ../sysdeps/unix/sysv/linux/epoll_wait.c:30
76
+ #1 0x00007ffff383eb9e in ?? () from /home/.rvm/gems/ruby-3.0.0/gems/grpc-1.60.1-x86_64-linux/src/ruby/lib/grpc/3.0/grpc_c.so
77
+ #2 0x00007ffff355e002 in ?? () from /home/.rvm/gems/ruby-3.0.0/gems/grpc-1.60.1-x86_64-linux/src/ruby/lib/grpc/3.0/grpc_c.so
78
+ #3 0x00007ffff38466e2 in ?? () from /home/.rvm/gems/ruby-3.0.0/gems/grpc-1.60.1-x86_64-linux/src/ruby/lib/grpc/3.0/grpc_c.so
79
+ #4 0x00007ffff35ba2ea in ?? () from /home/.rvm/gems/ruby-3.0.0/gems/grpc-1.60.1-x86_64-linux/src/ruby/lib/grpc/3.0/grpc_c.so
80
+ #5 0x00007ffff34abf6b in ?? () from /home/.rvm/gems/ruby-3.0.0/gems/grpc-1.60.1-x86_64-linux/src/ruby/lib/grpc/3.0/grpc_c.so
81
+ #6 0x00007ffff7c67ca7 in rb_nogvl (func=0x7ffff34abed3, data1=0x0, ubf=<optimized out>, data2=<optimized out>, flags=<optimized out>) at thread.c:1669
82
+ #7 0x00007ffff34ab110 in ?? () from /home/.rvm/gems/ruby-3.0.0/gems/grpc-1.60.1-x86_64-linux/src/ruby/lib/grpc/3.0/grpc_c.so
83
+ #8 0x00007ffff7c6780c in thread_do_start (th=0x555555ad16e0) at thread.c:769
84
+ #9 thread_start_func_2 (th=th@entry=0x555555ad16e0, stack_start=<optimized out>) at thread.c:822
85
+ #10 0x00007ffff7c679a6 in thread_start_func_1 (th_ptr=<optimized out>) at /home/.rvm/src/ruby-3.0.0/thread_pthread.c:994
86
+ #11 0x00007ffff78a63ec in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
87
+ #12 0x00007ffff7926a4c in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81
88
+ ```
89
+
90
+ We could take the following steps to get more debug info:
91
+
92
+ <h3>1) Fetch the correct grpc-native-debug gem</h3>
93
+
94
+ ```
95
+ cd /home
96
+ gem fetch grpc-native-debug-1.60.1.x86_64-linux.gem
97
+ gem unpack grpc-native-debug-1.60.1.x86_64-linux.gem
98
+ ```
99
+
100
+ (note again the version and platform of `grpc-native-debug` must match the `grpc` gem)
101
+
102
+ <h3>2) Load debug symbols (for ruby-3.0)</h3>
103
+
104
+ ```
105
+ (gdb) info sharedlibrary
106
+ From To Syms Read Shared Object Library
107
+ ...
108
+ 0x00007ffff3497450 0x00007ffff3a61912 Yes (*) /home/.rvm/gems/ruby-3.0.0/gems/grpc-1.60.1-x86_64-linux/src/ruby/lib/grpc/3.0/grpc_c.so
109
+ 0x00007ffff3e78730 0x00007ffff3ea60df Yes (*) /home/.rvm/gems/ruby-3.0.0/gems/google-protobuf-3.24.4-x86_64-linux/lib/google/3.0/protobuf_c.so
110
+ (*): Shared library is missing debugging information.
111
+ (gdb) add-symbol-file /home/grpc-native-debug-1.60.1-x86_64-linux/symbols/grpc-1.60.1-x86_64-linux-ruby-3.0.dbg 0x00007ffff3497450
112
+ add symbol table from file "/home/grpc-native-debug-1.60.1-x86_64-linux/symbols/grpc-1.60.1-x86_64-linux-ruby-3.0.dbg" at
113
+ .text_addr = 0x7ffff3497450
114
+ (y or n) y
115
+ Reading symbols from /home/grpc-native-debug-1.60.1-x86_64-linux/symbols/grpc-1.60.1-x86_64-linux-ruby-3.0.dbg...
116
+ (gdb)
117
+ ```
118
+
119
+ Our stack trace might look more like this now:
120
+
121
+ ```
122
+ (gdb) bt
123
+ #0 0x00007ffff7926e56 in epoll_wait (epfd=5, events=0x7ffff3cb4144, maxevents=100, timeout=-1) at ../sysdeps/unix/sysv/linux/epoll_wait.c:30
124
+ #1 0x00007ffff383eb9e in do_epoll_wait (ps=0x555555ad1690, deadline=...) at src/core/lib/iomgr/ev_epoll1_linux.cc:723
125
+ #2 pollset_work (ps=0x555555ad1690, worker_hdl=0x0, deadline=...) at src/core/lib/iomgr/ev_epoll1_linux.cc:1038
126
+ #3 0x00007ffff355e002 in pollset_work (pollset=<optimized out>, worker=<optimized out>, deadline=...) at src/core/lib/iomgr/ev_posix.cc:249
127
+ #4 0x00007ffff38466e2 in grpc_pollset_work (pollset=<optimized out>, worker=<optimized out>, deadline=...) at src/core/lib/iomgr/pollset.cc:48
128
+ #5 0x00007ffff35ba2ea in cq_next (cq=0x555555ad1510, deadline=..., reserved=<optimized out>) at src/core/lib/surface/completion_queue.cc:1043
129
+ #6 0x00007ffff34abf6b in run_poll_channels_loop_no_gil (arg=arg@entry=0x0) at ../../../../src/ruby/ext/grpc/rb_channel.c:663
130
+ #7 0x00007ffff7c67ca7 in rb_nogvl (func=0x7ffff34abed3 <run_poll_channels_loop_no_gil>, data1=0x0, ubf=<optimized out>, data2=<optimized out>, flags=flags@entry=0) at thread.c:1669
131
+ #8 0x00007ffff7c68138 in rb_thread_call_without_gvl (func=<optimized out>, data1=<optimized out>, ubf=<optimized out>, data2=<optimized out>) at thread.c:1785
132
+ #9 0x00007ffff34ab110 in run_poll_channels_loop (arg=<optimized out>) at ../../../../src/ruby/ext/grpc/rb_channel.c:734
133
+ #10 0x00007ffff7c6780c in thread_do_start (th=0x555555ad16e0) at thread.c:769
134
+ #11 thread_start_func_2 (th=th@entry=0x555555ad16e0, stack_start=<optimized out>) at thread.c:822
135
+ #12 0x00007ffff7c679a6 in thread_start_func_1 (th_ptr=<optimized out>) at /home/.rvm/src/ruby-3.0.0/thread_pthread.c:994
136
+ #13 0x00007ffff78a63ec in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
137
+ #14 0x00007ffff7926a4c in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81
138
+ ```
139
+
140
+ This is better, but if we try to examine a frame closely we'll notice
141
+ that source file information is still missing:
142
+
143
+ ```
144
+ (gdb) up
145
+ #1 0x00007ffff383eb9e in do_epoll_wait (ps=0x555555ad1690, deadline=...) at src/core/lib/iomgr/ev_epoll1_linux.cc:723
146
+ 723 src/core/lib/iomgr/ev_epoll1_linux.cc: No such file or directory.
147
+ (gdb) list
148
+ 718 in src/core/lib/iomgr/ev_epoll1_linux.cc
149
+ (gdb)
150
+ ```
151
+
152
+ <h3>3) Resolve source files</h3>
153
+
154
+ First, we fetch the *source* `grpc` gem at the **exact same version** of our binary
155
+ `grpc` gem:
156
+
157
+ ```
158
+ cd /home
159
+ gem fetch grpc-1.60.1.gem
160
+ gem unpack grpc-1.60.1.gem
161
+ ```
162
+
163
+ Now we can load those sources in gdb:
164
+
165
+ ```
166
+ (gdb) dir /home/grpc-1.60.1
167
+ Source directories searched: /home/grpc-1.60.1:$cdir:$cwd
168
+ (gdb)
169
+ ```
170
+
171
+ Our stack frame will might look more like this now:
172
+
173
+ ```
174
+ (gdb) list
175
+ warning: Source file is more recent than executable.
176
+ 718 int timeout = poll_deadline_to_millis_timeout(deadline);
177
+ 719 if (timeout != 0) {
178
+ 720 GRPC_SCHEDULING_START_BLOCKING_REGION;
179
+ 721 }
180
+ 722 do {
181
+ 723 r = epoll_wait(g_epoll_set.epfd, g_epoll_set.events, MAX_EPOLL_EVENTS,
182
+ 724 timeout);
183
+ 725 } while (r < 0 && errno == EINTR);
184
+ 726 if (timeout != 0) {
185
+ 727 GRPC_SCHEDULING_END_BLOCKING_REGION;
186
+ (gdb)
187
+ ```
188
+
189
+ But if we move up a few stack frames we might *still* be missing
190
+ some source information:
191
+
192
+ ```
193
+ (gdb) up
194
+ #6 0x00007ffff34abf6b in run_poll_channels_loop_no_gil (arg=arg@entry=0x0) at ../../../../src/ruby/ext/grpc/rb_channel.c:663
195
+ 663 ../../../../src/ruby/ext/grpc/rb_channel.c: No such file or directory.
196
+ ```
197
+
198
+ A portion of the grpc-ruby native extension is built from a sub-directory:
199
+ `src/ruby/ext/grpc`. So we also need to add that sub-directory, to fix this:
200
+
201
+ ```
202
+ (gdb) dir /home/grpc-1.60.1/src/ruby/ext/grpc
203
+ Source directories searched: /home/grpc-1.60.1/src/ruby/ext/grpc:/home/grpc-1.60.1:$cdir:$cwd
204
+ ```
205
+
206
+ Note the additional info:
207
+
208
+ ```
209
+ (gdb) list
210
+ warning: Source file is more recent than executable.
211
+ 658 gpr_mu_lock(&global_connection_polling_mu);
212
+ 659 gpr_cv_broadcast(&global_connection_polling_cv);
213
+ 660 gpr_mu_unlock(&global_connection_polling_mu);
214
+ 661
215
+ 662 for (;;) {
216
+ 663 event = grpc_completion_queue_next(
217
+ 664 g_channel_polling_cq, gpr_inf_future(GPR_CLOCK_REALTIME), NULL);
218
+ 665 if (event.type == GRPC_QUEUE_SHUTDOWN) {
219
+ 666 break;
220
+ 667 }
221
+ (gdb)
222
+ ```
223
+
224
+ # Support
225
+
226
+ grpc-native-debug currently only supports:
227
+
228
+ - ruby platforms: `x86_64-linux` and `x86-linux`
229
+
230
+ - grpc >= 1.60.0
data/platform.rb ADDED
@@ -0,0 +1,19 @@
1
+ # Copyright 2015 gRPC authors.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module GRPC
16
+ module NativeDebug
17
+ PLATFORM = 'x86-linux'
18
+ end
19
+ end
data/version.rb ADDED
@@ -0,0 +1,19 @@
1
+ # Copyright 2015 gRPC authors.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module GRPC
16
+ module NativeDebug
17
+ VERSION = '1.60.0.pre1'
18
+ end
19
+ end
metadata ADDED
@@ -0,0 +1,50 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: grpc-native-debug
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.60.0.pre1
5
+ platform: x86-linux
6
+ authors:
7
+ - grpc Authors
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-11-13 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Debug symbols to compliment the native libraries in pre-compiled Ruby
14
+ gRPC binary gems
15
+ email: grpc-io@googlegroups.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - README.md
21
+ - platform.rb
22
+ - symbols/grpc-1.60.0.pre1-x86-linux-ruby-2.7.dbg
23
+ - symbols/grpc-1.60.0.pre1-x86-linux-ruby-3.0.dbg
24
+ - symbols/grpc-1.60.0.pre1-x86-linux-ruby-3.1.dbg
25
+ - symbols/grpc-1.60.0.pre1-x86-linux-ruby-3.2.dbg
26
+ - version.rb
27
+ homepage: https://github.com/google/grpc/tree/master/src/ruby/nativedebug
28
+ licenses:
29
+ - Apache-2.0
30
+ metadata: {}
31
+ post_install_message:
32
+ rdoc_options: []
33
+ require_paths:
34
+ - lib
35
+ required_ruby_version: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ required_rubygems_version: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">"
43
+ - !ruby/object:Gem::Version
44
+ version: 1.3.1
45
+ requirements: []
46
+ rubygems_version: 3.4.1
47
+ signing_key:
48
+ specification_version: 4
49
+ summary: Debug symbols for the native library in Ruby gRPC
50
+ test_files: []