Difference between revisions of "Documentation/4.0/Developers/Tutorials/Troubleshooting"
From Slicer Wiki
Line 54: | Line 54: | ||
... | ... | ||
Copy/paste the listing in a text editor and ensure that for each CREATE of a pointer (e.g. 0x0123456) it exists a DELETE. If there isn't, you found what instance is leaking. Note the instance # (here instance #2 and #3) | Copy/paste the listing in a text editor and ensure that for each CREATE of a pointer (e.g. 0x0123456) it exists a DELETE. If there isn't, you found what instance is leaking. Note the instance # (here instance #2 and #3) | ||
− | Run the test with the [[Documentation/4.0/Developers/Tutorials/Debug_Instructions debugger]], set a breakpoint in the class constructor and ignore the break as many time as the instance number: | + | Run the test with the [[Documentation/4.0/Developers/Tutorials/Debug_Instructions|debugger]], set a breakpoint in the class constructor and ignore the break as many time as the instance number: |
(gdb) break vtkProperty2D::vtkProperty2D() | (gdb) break vtkProperty2D::vtkProperty2D() | ||
Breakpoint 1 at 0x5b22d0e55d04296: file vtkProperty2D.cxx, line 22 | Breakpoint 1 at 0x5b22d0e55d04296: file vtkProperty2D.cxx, line 22 |
Revision as of 21:38, 27 December 2011
Home < Documentation < 4.0 < Developers < Tutorials < TroubleshootingPage under construction. |
Here are some tips to narrow down various issues such as crash, or memory leaks
Disable features
Try running Slicer with as few features as possible:
- Disable Slicer options via the command line
$ ./Slicer --no-splash --ignore-slicerrc --disable-cli-module --disable-loadable-module --disable-scriptedmodule
- Look at all the possible options
$ ./Slicer --help
- Disable ITK plugins
- CLI modules silently load the ITK plugins in lib/Slicer-4.0/ITKFactories. These plugins are used to share the volumes between Slicer and the ITK filter without having to copy them on disk.
- rename lib/Slicer-4.0/ITKFactories into lib/Slicer-4.0/ITKFactories-disabled
- Disable Qt plugins
- rename lib/Slicer-4.0/iconengine into lib/Slicer-4.0/iconengine-disabled
Track memory leaks
- Turn ON the VTK_DEBUG_LEAKS CMake variable and build Slicer
- Create a test that reproduces the memory leak systematically After execution, the memory leaks are printed automatically by VTK on the standard output: 224: vtkDebugLeaks has detected LEAKS! 224: Class "vtkProperty2D" has 60 instances still around. ...
- Find what specific instance of a class (here vtkProperty2D) leaks. If the class is instantiated a large amount of time, it is hard to know what instance is leaking. You can edit the constructor and destructor of the class (here vtkProperty2D::vtkProperty2D() and vtkProperty2D::~vtkProperty2D()) vtkProperty2D::vtkProperty2D() { ... static int count = 0; std::cout << "CREATE vtkProperty2D instance #" << count++ << " " << this << std::endl; } vtkProperty2D::~vtkProperty2D() { ... static int count = 0; std::cout << "DELETE vtkProperty2D instance #" << count++ << " " << this << std::endl; } Don't forget to rebuild VTK if the class is from VTK (and not just Slicer inner build) After running the test again, you should see a list of ... CREATE vtkProperty2D instance #0 0x0123456 ... CREATE vtkProperty2D instance #1 0x01234E5 ... DELETE vtkProperty2D instance #0 0x0123456 ... DELETE vtkProperty2D instance #1 0x01234E5 ... CREATE vtkProperty2D instance #2 0x0123A23 ... CREATE vtkProperty2D instance #3 0x0124312 ... Copy/paste the listing in a text editor and ensure that for each CREATE of a pointer (e.g. 0x0123456) it exists a DELETE. If there isn't, you found what instance is leaking. Note the instance # (here instance #2 and #3) Run the test with the debugger, set a breakpoint in the class constructor and ignore the break as many time as the instance number: (gdb) break vtkProperty2D::vtkProperty2D() Breakpoint 1 at 0x5b22d0e55d04296: file vtkProperty2D.cxx, line 22 (gdb) ignore 1 2 When the debugger stops, check the call stack: (gdb) backtrace By analyzing the trace, you should be able to find the faulty instance.
- Analyze the code to see where the leak could be
Here is a listing of the most common mistakes
- this->MyXXX = vtkXXX::New();
- Is there a matching this->MyXXX->Delete() ?
- Are you sure
this->MyXXX
is0
before being assigned a new pointer ? If not, then you need to add
- this->MyXXX = vtkXXX::New();
To reduce memory leaks, use the following tools:
|