<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN""http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []><book id="debug-objects-guide"><bookinfo><title>Debug objects life time</title><authorgroup><author><firstname>Thomas</firstname><surname>Gleixner</surname><affiliation><address><email>tglx@linutronix.de</email></address></affiliation></author></authorgroup><copyright><year>2008</year><holder>Thomas Gleixner</holder></copyright><legalnotice><para>This documentation is free software; you can redistributeit and/or modify it under the terms of the GNU General PublicLicense version 2 as published by the Free Software Foundation.</para><para>This program is distributed in the hope that it will beuseful, but WITHOUT ANY WARRANTY; without even the impliedwarranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the GNU General Public License for more details.</para><para>You should have received a copy of the GNU General PublicLicense along with this program; if not, write to the FreeSoftware Foundation, Inc., 59 Temple Place, Suite 330, Boston,MA 02111-1307 USA</para><para>For more details see the file COPYING in the sourcedistribution of Linux.</para></legalnotice></bookinfo><toc></toc><chapter id="intro"><title>Introduction</title><para>debugobjects is a generic infrastructure to track the life timeof kernel objects and validate the operations on those.</para><para>debugobjects is useful to check for the following error patterns:<itemizedlist><listitem><para>Activation of uninitialized objects</para></listitem><listitem><para>Initialization of active objects</para></listitem><listitem><para>Usage of freed/destroyed objects</para></listitem></itemizedlist></para><para>debugobjects is not changing the data structure of the realobject so it can be compiled in with a minimal runtime impactand enabled on demand with a kernel command line option.</para></chapter><chapter id="howto"><title>Howto use debugobjects</title><para>A kernel subsystem needs to provide a data structure whichdescribes the object type and add calls into the debug code atappropriate places. The data structure to describe the objecttype needs at minimum the name of the object type. Optionalfunctions can and should be provided to fixup detected problemsso the kernel can continue to work and the debug information canbe retrieved from a live system instead of hard core debuggingwith serial consoles and stack trace transcripts from themonitor.</para><para>The debug calls provided by debugobjects are:<itemizedlist><listitem><para>debug_object_init</para></listitem><listitem><para>debug_object_init_on_stack</para></listitem><listitem><para>debug_object_activate</para></listitem><listitem><para>debug_object_deactivate</para></listitem><listitem><para>debug_object_destroy</para></listitem><listitem><para>debug_object_free</para></listitem><listitem><para>debug_object_assert_init</para></listitem></itemizedlist>Each of these functions takes the address of the real object anda pointer to the object type specific debug descriptionstructure.</para><para>Each detected error is reported in the statistics and a limitednumber of errors are printk'ed including a full stack trace.</para><para>The statistics are available via /sys/kernel/debug/debug_objects/stats.They provide information about the number of warnings and thenumber of successful fixups along with information about theusage of the internal tracking objects and the state of theinternal tracking objects pool.</para></chapter><chapter id="debugfunctions"><title>Debug functions</title><sect1 id="prototypes"><title>Debug object function reference</title>!Elib/debugobjects.c</sect1><sect1 id="debug_object_init"><title>debug_object_init</title><para>This function is called whenever the initialization functionof a real object is called.</para><para>When the real object is already tracked by debugobjects it ischecked, whether the object can be initialized. Initializingis not allowed for active and destroyed objects. Whendebugobjects detects an error, then it calls the fixup_initfunction of the object type description structure if providedby the caller. The fixup function can correct the problembefore the real initialization of the object happens. E.g. itcan deactivate an active object in order to prevent damage tothe subsystem.</para><para>When the real object is not yet tracked by debugobjects,debugobjects allocates a tracker object for the real objectand sets the tracker object state to ODEBUG_STATE_INIT. Itverifies that the object is not on the callers stack. If it ison the callers stack then a limited number of warningsincluding a full stack trace is printk'ed. The calling codemust use debug_object_init_on_stack() and remove the objectbefore leaving the function which allocated it. See nextsection.</para></sect1><sect1 id="debug_object_init_on_stack"><title>debug_object_init_on_stack</title><para>This function is called whenever the initialization functionof a real object which resides on the stack is called.</para><para>When the real object is already tracked by debugobjects it ischecked, whether the object can be initialized. Initializingis not allowed for active and destroyed objects. Whendebugobjects detects an error, then it calls the fixup_initfunction of the object type description structure if providedby the caller. The fixup function can correct the problembefore the real initialization of the object happens. E.g. itcan deactivate an active object in order to prevent damage tothe subsystem.</para><para>When the real object is not yet tracked by debugobjectsdebugobjects allocates a tracker object for the real objectand sets the tracker object state to ODEBUG_STATE_INIT. Itverifies that the object is on the callers stack.</para><para>An object which is on the stack must be removed from thetracker by calling debug_object_free() before the functionwhich allocates the object returns. Otherwise we keep track ofstale objects.</para></sect1><sect1 id="debug_object_activate"><title>debug_object_activate</title><para>This function is called whenever the activation function of areal object is called.</para><para>When the real object is already tracked by debugobjects it ischecked, whether the object can be activated. Activating isnot allowed for active and destroyed objects. Whendebugobjects detects an error, then it calls thefixup_activate function of the object type descriptionstructure if provided by the caller. The fixup function cancorrect the problem before the real activation of the objecthappens. E.g. it can deactivate an active object in order toprevent damage to the subsystem.</para><para>When the real object is not yet tracked by debugobjects thenthe fixup_activate function is called if available. This isnecessary to allow the legitimate activation of staticallyallocated and initialized objects. The fixup function checkswhether the object is valid and calls the debug_objects_init()function to initialize the tracking of this object.</para><para>When the activation is legitimate, then the state of theassociated tracker object is set to ODEBUG_STATE_ACTIVE.</para></sect1><sect1 id="debug_object_deactivate"><title>debug_object_deactivate</title><para>This function is called whenever the deactivation function ofa real object is called.</para><para>When the real object is tracked by debugobjects it is checked,whether the object can be deactivated. Deactivating is notallowed for untracked or destroyed objects.</para><para>When the deactivation is legitimate, then the state of theassociated tracker object is set to ODEBUG_STATE_INACTIVE.</para></sect1><sect1 id="debug_object_destroy"><title>debug_object_destroy</title><para>This function is called to mark an object destroyed. This isuseful to prevent the usage of invalid objects, which arestill available in memory: either statically allocated objectsor objects which are freed later.</para><para>When the real object is tracked by debugobjects it is checked,whether the object can be destroyed. Destruction is notallowed for active and destroyed objects. When debugobjectsdetects an error, then it calls the fixup_destroy function ofthe object type description structure if provided by thecaller. The fixup function can correct the problem before thereal destruction of the object happens. E.g. it can deactivatean active object in order to prevent damage to the subsystem.</para><para>When the destruction is legitimate, then the state of theassociated tracker object is set to ODEBUG_STATE_DESTROYED.</para></sect1><sect1 id="debug_object_free"><title>debug_object_free</title><para>This function is called before an object is freed.</para><para>When the real object is tracked by debugobjects it is checked,whether the object can be freed. Free is not allowed foractive objects. When debugobjects detects an error, then itcalls the fixup_free function of the object type descriptionstructure if provided by the caller. The fixup function cancorrect the problem before the real free of the objecthappens. E.g. it can deactivate an active object in order toprevent damage to the subsystem.</para><para>Note that debug_object_free removes the object from thetracker. Later usage of the object is detected by the otherdebug checks.</para></sect1><sect1 id="debug_object_assert_init"><title>debug_object_assert_init</title><para>This function is called to assert that an object has beeninitialized.</para><para>When the real object is not tracked by debugobjects, it callsfixup_assert_init of the object type description structureprovided by the caller, with the hardcoded object stateODEBUG_NOT_AVAILABLE. The fixup function can correct the problemby calling debug_object_init and other specific initializingfunctions.</para><para>When the real object is already tracked by debugobjects it isignored.</para></sect1></chapter><chapter id="fixupfunctions"><title>Fixup functions</title><sect1 id="debug_obj_descr"><title>Debug object type description structure</title>!Iinclude/linux/debugobjects.h</sect1><sect1 id="fixup_init"><title>fixup_init</title><para>This function is called from the debug code whenever a problemin debug_object_init is detected. The function takes theaddress of the object and the state which is currentlyrecorded in the tracker.</para><para>Called from debug_object_init when the object state is:<itemizedlist><listitem><para>ODEBUG_STATE_ACTIVE</para></listitem></itemizedlist></para><para>The function returns 1 when the fixup was successful,otherwise 0. The return value is used to update thestatistics.</para><para>Note, that the function needs to call the debug_object_init()function again, after the damage has been repaired in order tokeep the state consistent.</para></sect1><sect1 id="fixup_activate"><title>fixup_activate</title><para>This function is called from the debug code whenever a problemin debug_object_activate is detected.</para><para>Called from debug_object_activate when the object state is:<itemizedlist><listitem><para>ODEBUG_STATE_NOTAVAILABLE</para></listitem><listitem><para>ODEBUG_STATE_ACTIVE</para></listitem></itemizedlist></para><para>The function returns 1 when the fixup was successful,otherwise 0. The return value is used to update thestatistics.</para><para>Note that the function needs to call the debug_object_activate()function again after the damage has been repaired in order tokeep the state consistent.</para><para>The activation of statically initialized objects is a specialcase. When debug_object_activate() has no tracked object forthis object address then fixup_activate() is called withobject state ODEBUG_STATE_NOTAVAILABLE. The fixup functionneeds to check whether this is a legitimate case of astatically initialized object or not. In case it is it callsdebug_object_init() and debug_object_activate() to make theobject known to the tracker and marked active. In this casethe function should return 0 because this is not a real fixup.</para></sect1><sect1 id="fixup_destroy"><title>fixup_destroy</title><para>This function is called from the debug code whenever a problemin debug_object_destroy is detected.</para><para>Called from debug_object_destroy when the object state is:<itemizedlist><listitem><para>ODEBUG_STATE_ACTIVE</para></listitem></itemizedlist></para><para>The function returns 1 when the fixup was successful,otherwise 0. The return value is used to update thestatistics.</para></sect1><sect1 id="fixup_free"><title>fixup_free</title><para>This function is called from the debug code whenever a problemin debug_object_free is detected. Further it can be calledfrom the debug checks in kfree/vfree, when an active object isdetected from the debug_check_no_obj_freed() sanity checks.</para><para>Called from debug_object_free() or debug_check_no_obj_freed()when the object state is:<itemizedlist><listitem><para>ODEBUG_STATE_ACTIVE</para></listitem></itemizedlist></para><para>The function returns 1 when the fixup was successful,otherwise 0. The return value is used to update thestatistics.</para></sect1><sect1 id="fixup_assert_init"><title>fixup_assert_init</title><para>This function is called from the debug code whenever a problemin debug_object_assert_init is detected.</para><para>Called from debug_object_assert_init() with a hardcoded stateODEBUG_STATE_NOTAVAILABLE when the object is not found in thedebug bucket.</para><para>The function returns 1 when the fixup was successful,otherwise 0. The return value is used to update thestatistics.</para><para>Note, this function should make sure debug_object_init() iscalled before returning.</para><para>The handling of statically initialized objects is a specialcase. The fixup function should check if this is a legitimatecase of a statically initialized object or not. In this case onlydebug_object_init() should be called to make the object known tothe tracker. Then the function should return 0 because this is nota real fixup.</para></sect1></chapter><chapter id="bugs"><title>Known Bugs And Assumptions</title><para>None (knock on wood).</para></chapter></book>
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。