[asterisk-dev] [Code Review] 3377: ref count logs: Redo structure of log file, provide a python debugging tool
Matt Jordan
reviewboard at asterisk.org
Thu Mar 27 21:20:10 CDT 2014
> On March 27, 2014, 7:27 p.m., Corey Farrell wrote:
> > /branches/1.8/main/astobj2.c, line 35
> > <https://reviewboard.asterisk.org/r/3377/diff/3/?file=56815#file56815line35>
> >
> > #ifdef REF_DEBUG
> >
> > To take this suggestion we would need to put all "if (ref_log) {}" blocks in #ifdef sections. I believe this would be correct, as those blocks of code are unreachable if REF_DEBUG isn't defined during compile of astobj2.c (ref_log cannot be initialized). Previously this wasn't the case since modules could have REF_DEBUG enabled without astobj2.c enabling it.
> >
> > We also need to declare static FILE *ref_log = NULL, otherwise it can be used uninitialized.
>
> Matt Jordan wrote:
> This should be surrounded by #ifdef REF_DEBUG. Fixed.
>
> It doesn't not need to be initialized to NULL. static variables are automatically initialized to 0.
Actually, scratch that.
(1) We don't need to surround this with #ifdef REF_DEBUG, as the variable will always be 0 and any usage of ref_log will not execute. What's more, surrounding the declaration of ref_log with #ifdef REF_DEBUG could conceivably cause compilation errors when ao2_ref/ao2_alloc do not map to __ao2_ref_debug/__ao2_alloc_debug; more on that in (2) and (3). (Note: it didn't in my version of gcc, but that doesn't mean it wouldn't elsewhere)
(2) __ao2_ref_debug is only used if REF_DEBUG is enabled. Otherwise, ao2_ref maps to __ao2_ref. So there's no need to surround any of that code with conditional guards, as it is effectively unreachable. Even if REF_DEBUG is not enabled and we somehow manage to hit this code (which is impossible), ref_log will be 0 and hence will not execute.
(3) __ao2_alloc_debug is treated exactly the same.
However, with the way this works, ref_log must be declared, otherwise compiling without REF_DEBUG will fail to compile.
- Matt
-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviewboard.asterisk.org/r/3377/#review11414
-----------------------------------------------------------
On March 27, 2014, 4:08 p.m., Matt Jordan wrote:
>
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviewboard.asterisk.org/r/3377/
> -----------------------------------------------------------
>
> (Updated March 27, 2014, 4:08 p.m.)
>
>
> Review request for Asterisk Developers, Corey Farrell and wdoekes.
>
>
> Repository: Asterisk
>
>
> Description
> -------
>
> Note: while an improvement to Asterisk, this patch only affects Asterisk when compiled in -dev-mode. Since it has benefit only for developers looking to fix bugs, I'm proposing it for Asterisk 1.8+. The removal of refcounter should be done in trunk only.
>
> Asterisk uses reference counted objects. A lot. As their use has spread, the bugs related to reference counting errors has grown as well. Central to resolving reference counting issues is the usage of REF_DEBUG; unfortunately, REF_DEBUG has had several problems:
> (1) It could not be enabled through menuselect
> (2) When not enabled globally, updates to objects were often lost, resulting in insufficient data to resolve problems
> (3) The format of the ref debug log file was not suitable for parsing
>
> This patch changes REF_DEBUG in the following ways:
> (1) It makes REF_DEBUG a meneselect item when Asterisk is compiled with --enable-dev-mode
> (2) The ref debug log file is now created in the AST_LOG_DIR directory. Every run will now blow away the previous run (as large ref files sometimes caused issues). We now also no longer open/close the file on each write, instead relying on fflush to make sure data gets written to the file (in case the ao2 call being performed is about to cause a crash)
> (3) It goes with a comma delineated format for the ref debug file. This makes parsing much easier.
> (4) It throws out the refcounter utility and goes with a python script instead.
>
>
> Diffs
> -----
>
> /branches/1.8/utils/refcounter.c 410891
> /branches/1.8/utils/Makefile 410891
> /branches/1.8/main/astobj2.c 410891
> /branches/1.8/main/asterisk.c 410891
> /branches/1.8/include/asterisk/astobj2.h 410891
> /branches/1.8/contrib/scripts/refcounter.py PRE-CREATION
> /branches/1.8/channels/chan_sip.c 410891
> /branches/1.8/build_tools/cflags.xml 410891
>
> Diff: https://reviewboard.asterisk.org/r/3377/diff/
>
>
> Testing
> -------
>
> Things spit out ref logs and the script parses them. Example below:
>
> ==== Object 0x21ed9b8 history ====
> features.c[5427]:create_parkinglot 1 - [**constructor**]
> features.c[5707]:build_parkinglot +1 - [1]
> features.c[5392]:parkinglot_unref -1 - [2]
> features.c[6358]:build_dialplan_useage_map +1 - [1]
> features.c[6358]:build_dialplan_useage_map -1 - [2]
> features.c[4985]:find_parkinglot +1 - [1]
> features.c[5392]:parkinglot_unref -1 - [2]
> features.c[6358]:build_dialplan_useage_map +1 - [1]
> features.c[6358]:build_dialplan_useage_map -1 - [2]
> features.c[4955]:do_parking_thread +1 - [1]
> features.c[4957]:do_parking_thread -1 - [2]
> astobj2.c[955]:cd_cb_debug -1 deref object via container destroy - [1]
> astobj2.c[955]:cd_cb_debug -1 deref object via container destroy - [**call destructor**]
>
>
> Thanks,
>
> Matt Jordan
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-dev/attachments/20140328/78d63596/attachment-0001.html>
More information about the asterisk-dev
mailing list