Project

General

Profile

Debugging » History » Version 3

Jaroslav Kysela, 2015-06-02 10:14

1 1 Adam Sutton
h1. Debugging
2
3
If you're going to be regularly trying development versions of Tvheadend or need to report a crash or deadlock then you should really read this page!
4
5
If you are investigating problems within Tvheadend then its worth being familiar with tools such as gdb and valgrind, although these are not covered here.
6
7
However one thing that can be useful in investigating crashes within Tvheadend is to ensure that coredumps are generated, this will allow post analysis in gdb without having to actual run Tvheadend within gdb.
8
9
You can enable temporarily by running:
10
11
<pre>
12
ulimit -c unlimited
13
</pre>
14
15
To make this permanent put this somewhere in your shell environment setup (.bashrc, .profile, etc...)
16
Firstly I'd recommend that if you're specifically trying to investigate an issue then you should consider running Tvheadend manually, rather than as a service, as documented [[Development|here]].
17
18
h2. Logging
19
20
I'd strongly recommend that if you're specifically trying to investigate a crash or other problem in Tvheadend that you enable debugging:
21
22
* *-s* will output debug info to syslog
23
* *--debug* allows you to specify which subsystem to debug (TODO: add more info)
24
* *--trace* allows you to enable trace (more in-depth) logging on specific subsystems
25
26
You can also get Tvheadend to log to it's own file using:
27
28
<pre>
29
-l FILE
30
</pre>
31
32 2 Jaroslav Kysela
You may also modify the debug settings using WEB GUI as admin - Configuration/Debugging. Note that the information is not saved,
33
it is just set for run-time (current task).
34
35
* Debug log path - filename to store log
36
* Debug trace - enable traces
37
* Debug subsystems - comma separated list of subsystems
38
* Trace subsystems - comma separated list of subsystems
39
40 3 Jaroslav Kysela
The traces must be compiled to the tvheadend binary - see [[Traces]].
41 2 Jaroslav Kysela
42 1 Adam Sutton
h2. Enabling coredumps
43
44
Although you can run Tvheadend within gdb, personally I never bother. If you need to investigate some running problem you can always attach (see below) later and if you need to trap crashes, then you can configure your system to generate a core file and then retrospectively analyse this with gdb.
45
46
If you're running manually you should enable coredumps in your environment:
47
48
<pre>
49
ulimit -c unlimited
50
</pre>
51
52
I'd recommend you enable this permanently by putting this command in your shell initialisation scripts (.bashrc etc..).
53
54
If you're running as a daemon then you should use the -D command line option, this will enable coredumps from the daemon. If you start using sysvinit, upstart etc... then you will need to put this in the configuration file, e.g.:
55
56
<pre>
57
TVH_ARGS="-D"
58
</pre>
59
60
Finally it's probably worth changing the coredump file format, personally I use the following configuration:
61
62
<pre>
63
echo core.%h.%e.%t | sudo tee /proc/sys/kernel/core_pattern
64
echo 0 | sudo tee /proc/sys/kernel/core_uses_pid
65
</pre>
66
67
Or put the following in /etc/sysctl.conf:
68
69
<pre>
70
kernel.core_pattern = core.%h.%e.%t
71
kernel.core_uses_pid = 0
72
</pre>
73
74
If you're using a system like Ubuntu that uses apport (and cripples the ability to change the core format) just set core_uses_pid=1 instead.
75
76
Note: coredumps are (by default) stored in the current working directory, to make it possible for the daemon to write files the current working directory is set to /tmp when using -D, so check there for core files.
77
78
To verify that you have everything configured properly you can use the -A option to force a crash on startup. Do this from the command line or add to /etc/default/tvheadend:
79
80
<pre>
81
TVH_ARGS="-D -A"
82
</pre>
83
84
Note: remember to remove the option after you've tested it!
85
86
h2. Processing core file.
87
88
Once you have a core file you can start up gdb with that coredump, just as if you'd caught the crash while running under gdb:
89
90
<pre>
91
gdb tvheadend core
92
</pre>
93
94
You may need to replace _tvheadend_ and _core_ above with the proper paths.
95
96
For most crashes the most useful information is the back trace, this will provide a stack trace showing where the code crashed and the stack information at the time of the crash:
97
98
<pre>
99
(gdb) set logging on
100
(gdb) set pagination off
101
(gdb) bt full
102
#0  0x00007f5b10cc1425 in __GI_raise (sig=<optimised out>)
103
    at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
104
        resultvar = 0
105
        pid = <optimised out>
106
        selftid = 7517
107
#1  0x00007f5b10cc4b10 in __GI_abort () at abort.c:120
108
        act = {__sigaction_handler = {sa_handler = 0, sa_sigaction = 0}, 
109
          sa_mask = {__val = {18446744073709551615 <repeats 16 times>}}, 
110
          sa_flags = 0, sa_restorer = 0}
111
        sigs = {__val = {32, 0 <repeats 15 times>}}
112
#2  0x000000000040744e in main (argc=<optimised out>, argv=<optimised out>)
113
    at src/main.c:810
114
        i = <optimised out>
115
        set = {__val = {16386, 0 <repeats 15 times>}}
116
        adapter_mask = <optimised out>
117
        log_level = <optimised out>
118
        log_options = <optimised out>
119
        log_debug = <optimised out>
120
        log_trace = <optimised out>
121
        buf = "/tmp\000\000\000\000\360\350\364\023[\177\000\000\000\320\365\023[\177\000\000t\n\327\023[\177\000\000\370\271\311\020[\177\000\000\017\000\000\000\000\000\000\000:\000\000\000\000\000\000\000h\344\364\023[\177\000\000.N=\366\000\000\000\000\236\022\327\023[\177\000\000\300\304S\205\377\177\000\000.\000\000\000\000\000\000\000 \305S\205\377\177\000\000\377\377\377\377\000\000\000\000\264\352\310\020[\177\000\000\250\354\310\020[\177\000\000\360\304S\205\377\177\000\000\360\350\364\023[\177\000\000@\256\311\020[\177", '\000' <repeats 18 times>"\340, \346\364\023[\177\000\000\000\320\365\023[\177\000\000\231,@\000\000\000\000\000\370\271\311\020[\177\000\000\340\033@\000\000\000\000\000\000\000\000\000\001\000\000\000\021\b\000\000\001", '\000' <repeats 11 times>, " \266\370\023[\177\000\000`\305S\205\377\177\000\000.N=\366\000\000\000\000\340\346\364\023[\177\000\000\200\305S\205\377\177\000\000"...
122
        opt_help = 0
123
        opt_version = 0
124
        opt_fork = 1
125
        opt_firstrun = 0
126
        opt_stderr = 0
127
        opt_syslog = 0
128
        opt_uidebug = 0
129
</pre>
130
131
Note: "set logging on" will cause GDB to write its output to a file, by default this will be gdb.txt in the current directory.
132
133
However I'd strongly recommend that you keep a copy of tvheadend binary and core file in case further analysis is required.
134
135
h2. Dead or Live Lock
136
137
If Tvheadend appears to die but the process is still running, then its quite possible that the process is deadlocked (or possibly live locked). The best way to help investigate such a problem is to get a full stack trace from every thread in the system.
138
139
First attach gdb to the running process:
140
141
<pre>
142
gdb tvheadend pid
143
</pre>
144
145
You may need to replace _tvheadend_ with the full path to the binary and you will need to replace _pid_ with the PID of the running process. To find that run:
146
147
<pre>
148
ps -C tvheadend
149
</pre>
150
151
Once you have gdb attached grab a stack trace from every thread using the following command:
152
153
<pre>
154
(gdb) set logging on
155
(gdb) set pagination off
156
(gdb) thread apply all bt full
157
</pre>
158
159
Note: "set logging on" will cause GDB to write its output to a file, by default this will be gdb.txt in the current directory.
160
161
It might also be useful to generate a core file for good measure:
162
163
<pre>
164
(gdb) generate-core-file
165
</pre>
166
167
This information may give an indication as to why things are locked, often 2 threads are stuck trying to lock a mutex (probably each holds the opposite lock).
168
169
h2. Reporting crash (or lock)
170
171
If you're going to report a crash (or lockup) then please try to provide the above information, including a debug log (or whatever logging you have), a core file and if you're not using a pre-built tvheadend package then the binary and basic information about the platform (distribution, version and architecture) you're running on.