Objective C:Object Deallocated while key value observers were still registered with it

问:

I am hitting the below error after I added 2 additional fields to my core data model.

CarPark_CarPark_ was deallocated while key value observers were still registered with it. Observation info was leaked, and may even become mistakenly attached to some other object. 
Set a breakpoint on NSKVODeallocateBreak to stop here in the debugger. 
Here's the current observation info:
<NSKeyValueObservationInfo 0x1b6510> (
<NSKeyValueObservance 0x19b210: Observer: 0x1a8cf0, Key path: coordinate, 
Options: <New: NO, Old:     NO, Prior: YES> Context: 0x0, Property: 0x1b7e00>
)

I am a little lost on what to do next. Any guidance on this will be greatly greatly appreciated! Please let me know what other information is required.

Thanks in advance

Zhen


答:

To set the breakpoint open the breakpoints tab in Xcode 4 (Breakpoints window in Xcode 3) and add a new symbolic Breakpoint for the symbol "NSKVODeallocateBreak"

Use the debugger console to print the observer at the adress given in the observation info

Observer: 0x19af20

po 0x19af20

This should give some valuable information about the observer. Override addObserver:forKeyPath:options:context: in your custom CarPark class and set a breakpoint to see the exact location of the observing being established.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Table of Contents Summary of GDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 Free software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 Contributors to GDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 A Sample GDB Session . . . . . . . . . . . . . . . . . . . . 5 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 2 Loading the Executable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Setting Display width. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Setting Breakpoints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Running the executable under GDB . . . . . . . . . . . . . . . . . . . . . . Stepping to the next line in the source program . . . . . . . . . . . . Stepping into a subroutine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examining the Stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Printing Variable Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Listing Source Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Setting Variable Values During a Session . . . . . . . . . . . . . . . . . Getting In and Out of GDB . . . . . . . . . . . . . . . 11 2.1 Invoking GDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1 Choosing files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.2 Choosing modes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.3 Redirecting WDB input and output to a file . . . . . 2.2 Quitting GDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 Shell commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 5 6 6 6 6 6 7 7 7 8 11 11 13 15 15 16 GDB Commands . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.1 Command syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.2 Command completion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.3 Getting help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 4 Running Programs Under GDB . . . . . . . . . . . 23 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 Compiling for debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Starting your program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arguments To Your Program. . . . . . . . . . . . . . . . . . . . . . . . . . . . Program Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Working directory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Program Input and Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Debugging a Running Process . . . . . . . . . . . . . . . . . . . . . . . . . . . Killing the child process . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Debugging programs with multiple threads . . . . . . . . . . . . . . . Debugging programs with multiple processes . . . . . . . . . . . . 23 23 24 25 26 26 27 28 28 31 ii 5 Debugging with GDB Stopping and Continuing . . . . . . . . . . . . . . . . . . 33 5.1 Breakpoints. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.1 Setting breakpoints . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.2 Setting catchpoints . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.3 Deleting breakpoints . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.4 Disabling breakpoints . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.5 Break conditions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.6 Breakpoint command lists . . . . . . . . . . . . . . . . . . . . . . 5.1.7 Breakpoint menus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.8 “Cannot insert breakpoints” . . . . . . . . . . . . . . . . . . . . 5.2 Continuing and stepping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3 Signals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.4 Stopping and starting multi-thread programs . . . . . . . . . . . . . 6 Examining the Stack . . . . . . . . . . . . . . . . . . . . . . 51 6.1 6.2 6.3 6.4 6.5 6.6 7 Stack frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Stacks Without frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Commands for Examining the Stack . . . . . . . . . . . . . . . . . . . . . Backtraces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Selecting a frame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Information about a frame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 51 52 52 53 54 Examining Source Files . . . . . . . . . . . . . . . . . . . 57 7.1 7.2 7.3 7.4 8 33 33 37 38 39 40 41 42 43 43 46 48 Printing source lines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Searching source files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Specifying source directories . . . . . . . . . . . . . . . . . . . . . . . . . . . . Source and machine code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 58 59 59 Examining Data . . . . . . . . . . . . . . . . . . . . . . . . . . 63 8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8 8.9 8.10 8.11 8.12 Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Program variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Artificial arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Output formats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examining memory. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Automatic display . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Print settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Value history . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Convenience variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Registers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Printing Floating Point Values . . . . . . . . . . . . . . . . . . . . . . . . . Floating point hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 64 65 66 67 68 70 74 75 76 78 78 iii 9 Using GDB with Different Languages . . . . . . 79 9.1 Switching between source languages . . . . . . . . . . . . . . . . . . . . . 9.1.1 List of filename extensions and languages . . . . . . . . 9.1.2 Setting the working language . . . . . . . . . . . . . . . . . . . 9.1.3 Having GDB infer the source language . . . . . . . . . . 9.2 Displaying the language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.3 Type and range checking. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.3.1 An overview of type checking . . . . . . . . . . . . . . . . . . . 9.3.2 An overview of range checking . . . . . . . . . . . . . . . . . . 9.4 Supported languages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.4.1 C and C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.4.1.1 C and C++ operators . . . . . . . . . . . . . . . . . . 9.4.1.2 C and C++ constants . . . . . . . . . . . . . . . . . . 9.4.1.3 C++ expressions . . . . . . . . . . . . . . . . . . . . . . . 9.4.1.4 C and C++ defaults . . . . . . . . . . . . . . . . . . . 9.4.1.5 C and C++ type and range checks . . . . . . 9.4.1.6 GDB and C . . . . . . . . . . . . . . . . . . . . . . . . . . 9.4.1.7 GDB features for C++ . . . . . . . . . . . . . . . . . 9.4.2 Fortran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.4.2.1 Fortran types . . . . . . . . . . . . . . . . . . . . . . . . . 9.4.2.2 Fortran operators . . . . . . . . . . . . . . . . . . . . . 9.4.2.3 Fortran special issues . . . . . . . . . . . . . . . . . . 79 79 80 80 80 81 81 82 83 83 84 85 86 87 88 88 88 89 90 90 91 10 Examining the Symbol Table . . . . . . . . . . . . . 93 11 Altering Execution . . . . . . . . . . . . . . . . . . . . . . 97 11.1 11.2 11.3 11.4 11.5 11.6 12 Assignment to variables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 Continuing at a different address . . . . . . . . . . . . . . . . . . . . . . . 98 Giving your program a signal . . . . . . . . . . . . . . . . . . . . . . . . . . 99 Returning from a function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 Calling program functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 Patching programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 GDB Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 12.1 Commands to specify files . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 12.2 Specifying shared library locations . . . . . . . . . . . . . . . . . . . . . 106 12.3 Errors reading symbol files . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 13 Specifying a Debugging Target . . . . . . . . . . 109 13.1 Active targets. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 13.2 Commands for managing targets . . . . . . . . . . . . . . . . . . . . . . 109 13.3 Choosing target byte order. . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 iv 14 Debugging with GDB HP-UX Configuration-Specific Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 14.1 Summary of HP Enhancements to GDB . . . . . . . . . . . . . . . 113 14.2 HP-UX dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 14.2.1 Linker Dependencies . . . . . . . . . . . . . . . . . . . . . . . . . 115 14.2.2 Dependent Standard Library Routines for Run Time Checking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 14.3 Supported Platforms and Modes . . . . . . . . . . . . . . . . . . . . . . 117 14.4 HP-UX targets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 14.5 Support for Alternate root . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 14.6 Specifying object file directories . . . . . . . . . . . . . . . . . . . . . . . 118 14.7 Fix and continue debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 14.7.1 Fix and Continue compiler dependencies . . . . . . 120 14.7.2 Fix and Continue restrictions . . . . . . . . . . . . . . . . . 121 14.7.3 Using Fix and Continue . . . . . . . . . . . . . . . . . . . . . . 121 14.7.4 Example Fix and Continue session . . . . . . . . . . . . 122 14.8 Inline Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 14.8.1 Inline Debugging in HP 9000 Systems . . . . . . . . . 124 14.8.2 Inline Debugging in Integrity Systems . . . . . . . . . 125 14.8.2.1 Debugging Inline Functions in Integrity Systems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 14.9 Debugging memory problems . . . . . . . . . . . . . . . . . . . . . . . . . 128 14.9.1 When to suspect a memory leak . . . . . . . . . . . . . . 128 14.9.2 Memory debugging restrictions . . . . . . . . . . . . . . . 128 14.9.3 Memory Debugging Methodologies . . . . . . . . . . . . 128 14.9.4 Debugging Memory in Interactive Mode . . . . . . . 129 14.9.4.1 Commands for interactive memory debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 14.9.4.2 Example for interactive debugging session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 14.9.5 Debugging Memory in Batch Mode . . . . . . . . . . . 133 14.9.5.1 Setting Configuration Options for Batch Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 14.9.5.2 Environment variable setting for Batch mode debugging . . . . . . . . . . . . . . . . . . . . . . . . . 134 14.9.5.3 Example for Batch Mode RTC . . . . . . . 135 14.9.6 Debugging Memory Interactively After Attaching to a Running Process . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 14.9.7 Configuring memory debugging settings . . . . . . . 137 14.9.7.1 Specifying the stack depth . . . . . . . . . . . 137 14.9.7.2 Specifying minimum leak size . . . . . . . . 138 14.9.7.3 Specifying minimum block size . . . . . . . 138 14.9.8 Scenarios in memory debugging . . . . . . . . . . . . . . . 138 14.9.8.1 Stop when freeing unallocated or deallocated blocks . . . . . . . . . . . . . . . . . . . . . . . 138 14.9.8.2 Stop when freeing a block if bad writes occurred outside block boundary . . . . . . . . . . 138 v 14.9.8.3 Stop when a specified block address is allocated or deallocated . . . . . . . . . . . . . . . . . . 139 14.9.8.4 Scramble previous memory contents at malloc/free calls . . . . . . . . . . . . . . . . . . . . . . . . . 139 14.9.9 Comparison of Memory Debugging Commands in Interactive Mode and Batch Mode . . . . . . . . . . . . . . . 140 14.9.10 Heap Profiling. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 14.9.10.1 Commands for heap profiling . . . . . . . 142 14.9.10.2 info heap arena . . . . . . . . . . . . . . . . . . 143 14.9.10.3 info heap arena [0 |1|2|..] blocks stacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 14.9.10.4 info module ADDRESS . . . . . . . . . . . . . . 143 14.9.10.5 info heap process . . . . . . . . . . . . . . . . 143 14.9.10.6 Example for heap profiling . . . . . . . . . . 143 14.9.11 Memory Checking Analysis for User Defined Memory Management Routines . . . . . . . . . . . . . . . . . . 144 14.9.12 Commands to track the change in data segment value . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 14.10 Thread Debugging Support . . . . . . . . . . . . . . . . . . . . . . . . . . 145 14.10.1 Support for Enabling and Disabling Specific Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 14.10.2 Backtrace Support for Thread Debugging . . . . 146 14.10.3 Advanced Thread Debugging Support . . . . . . . . 146 14.10.3.1 Pre-requisites for Advanced Thread Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 14.10.3.2 Enabling and Disabling Advanced Thread Debugging Features. . . . . . . . . . . . . . . 148 14.10.3.3 Commands to view information on pthread primitives . . . . . . . . . . . . . . . . . . . . . . . 150 14.11 Debugging MPI Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 14.12 Debugging multiple processes ( programs with fork and vfork calls) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 14.12.1 Ask mode for set follow-fork-mode . . . . . . . . 151 14.12.2 serial mode for set follow-fork-mode . . . . . . . 151 14.12.3 Support for showing unwind info. . . . . . . . . . . . . 151 14.12.4 Printing CFM and PFS registers. . . . . . . . . . . . . 152 14.13 Debugging Core Files. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 14.13.1 Generating core files with packcore /unpackcore/getcore . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 14.13.2 Support for the dumpcore command . . . . . . . . . 153 14.13.2.1 Enhancements to the dumpcore command . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 14.14 Invoking GDB Before a Program Aborts . . . . . . . . . . . . . . 154 14.15 Instruction Level Stepping . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 14.16 Enhanced support for watchpoints and breakpoints . . . . 155 14.16.1 Deferred watchpoints . . . . . . . . . . . . . . . . . . . . . . . 155 14.16.2 Hardware watchpoints . . . . . . . . . . . . . . . . . . . . . . 155 14.16.3 Hardware breakpoints . . . . . . . . . . . . . . . . . . . . . . 155 vi Debugging with GDB 14.17 14.18 14.19 14.20 14.21 14.22 14.23 14.16.3.1 Setting breakpoints in unstripped shared library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 14.16.4 Support for procedural breakpoints . . . . . . . . . . 155 14.16.5 Support for template breakpoints . . . . . . . . . . . . 156 Debugging support for shared libraries . . . . . . . . . . . . . . . . 156 14.17.1 Using shared library as main program . . . . . . . . 157 14.17.2 Setting Deferred Breakpoints in Shared Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 14.17.3 Using catch load . . . . . . . . . . . . . . . . . . . . . . . . . . 158 14.17.4 Privately mapping shared libraries . . . . . . . . . . . 158 14.17.5 Selectively Mapping Shared Libraries As Private . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 14.17.6 Setting breakpoints in shared library . . . . . . . . . 159 Language support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 14.18.1 Enhanced Java Debugging Support . . . . . . . . . . 159 14.18.2 Commands for Examining Java Virtual Machine(JVM) internals . . . . . . . . . . . . . . . . . . . . . . . . . 159 14.18.2.1 Java subcommands . . . . . . . . . . . . . . . . 160 14.18.3 Support for stack traces in Java, C, and C++ programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 14.18.4 Support for 64-bit Java, C, aC++ stack unwinding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 14.18.5 Enhanced support for C++ templates . . . . . . . . . 161 14.18.6 Support for __fpreg data type on IPF . . . . . . . 162 14.18.7 Support for Complex variables in HP C . . . . . 162 14.18.8 Support for debugging namespaces . . . . . . . . . . . 163 14.18.9 Command for evaluating the address of an expression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 Viewing Wide Character Strings . . . . . . . . . . . . . . . . . . . . . 163 Support for output logging . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 14.20.1 Support for dumping array in an ASCII file . . 164 14.20.2 Support for Fortran array slices . . . . . . . . . . . . . . 165 14.20.3 Displaying enumerators . . . . . . . . . . . . . . . . . . . . . 165 14.20.4 Support for debugging typedefs . . . . . . . . . . . . . . 165 14.20.5 Support for steplast command for C and C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 Getting information from a non-debug executable . . . . . 166 Debugging optimized code . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 14.22.1 Debugging Optimized Code at Various Optimization Levels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 14.22.1.1 +O0 and +O1 . . . . . . . . . . . . . . . . . . . . . . . 169 14.22.1.2 +O2 and +O3 . . . . . . . . . . . . . . . . . . . . . . . 169 14.22.1.3 +O4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 Visual Interface for WDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 14.23.1 Starting and stopping Visual Interface for WDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 14.23.2 Navigating the Visual Interface for WDB display . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 vii 14.23.3 Specifying foreground and background colors . . 172 14.23.4 Using the X-window graphical interface . . . . . . 173 14.23.5 Using the TUI mode . . . . . . . . . . . . . . . . . . . . . . . . 173 14.23.6 Changing the size of the source or debugger pane . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 14.23.7 Using commands to browse through source files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 14.23.8 Loading source files . . . . . . . . . . . . . . . . . . . . . . . . . 175 14.23.9 Editing source files . . . . . . . . . . . . . . . . . . . . . . . . . 175 14.23.10 Editing the command line and command-line history . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 14.23.11 Saving the contents of a debugging session to a file. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 14.24 Support for ddd. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 14.25 Support for XDB commands . . . . . . . . . . . . . . . . . . . . . . . . . 176 14.25.1 stop in/at dbx commands . . . . . . . . . . . . . . . . . . . 176 14.26 GNU GDB Logging Commands . . . . . . . . . . . . . . . . . . . . . . 176 14.27 Support for command line calls in a stripped executable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 14.27.1 Support for command line calls in a stripped executable on PA-RISC systems . . . . . . . . . . . . . . . . . 176 14.27.2 Additional support for command line calls in a stripped executable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 14.27.2.1 For 32-bit applications: . . . . . . . . . . . . . 177 14.27.2.2 For 64-bit applications . . . . . . . . . . . . . 177 14.27.3 Support for debugging stripped binaries . . . . . . 178 14.27.3.1 Printing of locals and globals in a stripped module . . . . . . . . . . . . . . . . . . . . . . . . . 178 14.27.3.2 Backtrace on stripped frames . . . . . . . 178 14.27.3.3 Command line calls to non-stripped library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 14.27.3.4 Setting breakpoints in unstripped shared library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 14.28 Displaying the current block scope information . . . . . . . . 178 14.29 Linux support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 15 The HP-UX Terminal User Interface. . . . . 181 15.1 Starting the TUI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15.2 Automatically running a program at startup . . . . . . . . . . . 15.3 Screen Layouts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15.3.1 Source pane . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15.3.2 Disassembly pane . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15.3.3 Source/Disassembly pane . . . . . . . . . . . . . . . . . . . . 15.3.4 Disassembly/Register pane . . . . . . . . . . . . . . . . . . . 15.3.5 Source/Register pane . . . . . . . . . . . . . . . . . . . . . . . . 15.4 Cycling through the panes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15.5 Changing pane focus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15.6 Scrolling panes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 182 183 183 183 184 185 186 187 187 190 viii Debugging with GDB 15.7 Changing the register display . . . . . . . . . . . . . . . . . . . . . . . . . 190 15.8 Changing the pane size . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 15.9 Refreshing and updating the window . . . . . . . . . . . . . . . . . . 193 16 XDB to WDB Transition Guide . . . . . . . . . 195 16.1 By-function lists of XDB commands and HP WDB equivalents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 16.1.1 Invocation commands . . . . . . . . . . . . . . . . . . . . . . . . 196 16.1.2 Window mode commands . . . . . . . . . . . . . . . . . . . . 196 16.1.3 File viewing commands . . . . . . . . . . . . . . . . . . . . . . 197 16.1.4 Source directory mapping commands . . . . . . . . . . 198 16.1.5 Data Viewing and modification commands. . . . . 199 16.1.6 Stack viewing commands . . . . . . . . . . . . . . . . . . . . . 201 16.1.7 Status-viewing command . . . . . . . . . . . . . . . . . . . . . 201 16.1.8 Job control commands . . . . . . . . . . . . . . . . . . . . . . . 202 16.2 Overall breakpoint commands . . . . . . . . . . . . . . . . . . . . . . . . . 203 16.2.1 Auxiliary breakpoint commands . . . . . . . . . . . . . . 203 16.2.2 Breakpoint creation commands . . . . . . . . . . . . . . . 204 16.2.3 Breakpoint status commands . . . . . . . . . . . . . . . . . 205 16.2.4 All-procedures breakpoint commands . . . . . . . . . 206 16.2.5 Global breakpoint commands . . . . . . . . . . . . . . . . . 207 16.2.6 Assertion control commands . . . . . . . . . . . . . . . . . . 207 16.2.7 Record and playback commands . . . . . . . . . . . . . . 207 16.2.8 Macro facility commands . . . . . . . . . . . . . . . . . . . . . 208 16.2.9 Signal control commands . . . . . . . . . . . . . . . . . . . . . 208 16.2.10 Miscellaneous commands . . . . . . . . . . . . . . . . . . . . 209 16.3 XDB data formats and HP WDB equivalents . . . . . . . . . . . 210 16.4 XDB location syntax and HP WDB equivalents . . . . . . . . 212 16.5 XDB special language operators and HP WDB equivalents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 16.6 XDB special variables and HP WDB equivalents. . . . . . . . 213 16.7 XDB variable identifiers and HP WDB equivalents. . . . . . 215 16.8 Alphabetical lists of XDB commands and HP WDB equivalents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215 16.8.1 A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 16.8.2 B . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 16.8.3 C through D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 16.8.4 F through K . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 16.8.5 L . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 16.8.6 M through P . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 16.8.7 Q through S . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222 16.8.8 T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224 16.8.9 U through Z . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224 16.8.10 Symbols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226 ix 17 Controlling GDB . . . . . . . . . . . . . . . . . . . . . . . 231 17.1 17.2 17.3 17.4 17.5 17.6 17.7 18 Setting the GDB Prompt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Setting Command Editing Options in GDB . . . . . . . . . . . . Setting Command History Feature in GDB . . . . . . . . . . . . . Setting the GDB Screen Size . . . . . . . . . . . . . . . . . . . . . . . . . . Supported Number Formats. . . . . . . . . . . . . . . . . . . . . . . . . . . Optional warnings and messages . . . . . . . . . . . . . . . . . . . . . . Optional messages about internal happenings. . . . . . . . . . . 231 231 231 233 233 234 235 Canned Sequences of Commands . . . . . . . . 237 18.1 18.2 18.3 18.4 User-defined commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . User-defined command hooks . . . . . . . . . . . . . . . . . . . . . . . . . Command files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Commands for controlled output . . . . . . . . . . . . . . . . . . . . . . 237 238 239 239 19 Using GDB under gnu Emacs . . . . . . . . . . . 241 20 GDB Annotations . . . . . . . . . . . . . . . . . . . . . . 243 20.1 20.2 20.3 20.4 20.5 20.6 20.7 20.8 20.9 20.10 20.11 20.12 21 What is an annotation? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . The server prefix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Values. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Displays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Annotation for GDB input . . . . . . . . . . . . . . . . . . . . . . . . . . . . Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Information on breakpoints . . . . . . . . . . . . . . . . . . . . . . . . . . . Invalidation notices. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Running the program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Displaying source . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Annotations We Might Want in the Future . . . . . . . . . . . . 243 243 244 245 246 247 247 248 248 249 249 250 The gdb/mi Interface . . . . . . . . . . . . . . . . . . . 251 Function and purpose . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Notation and terminology . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.1 gdb/mi Command Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.1.1 gdb/mi Input syntax . . . . . . . . . . . . . . . . . . . . . . . . 21.1.2 gdb/mi Output syntax . . . . . . . . . . . . . . . . . . . . . . 21.1.3 Simple examples of gdb/mi interaction . . . . . . . . 21.2 gdb/mi compatibility with CLI . . . . . . . . . . . . . . . . . . . . . . . 21.3 gdb/mi output records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.3.1 gdb/mi result records . . . . . . . . . . . . . . . . . . . . . . . 21.3.2 gdb/mi stream records . . . . . . . . . . . . . . . . . . . . . . 21.3.3 gdb/mi out-of-band records . . . . . . . . . . . . . . . . . . 21.4 gdb/mi command description format . . . . . . . . . . . . . . . . . . 21.5 gdb/mi breakpoint table commands . . . . . . . . . . . . . . . . . . . 21.6 gdb/mi Data manipulation . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.7 gdb/mi program control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251 251 251 251 252 254 254 255 255 255 255 256 257 265 275 x Debugging with GDB 21.8 21.9 21.10 21.11 21.12 21.13 21.14 22 Miscellaneous GDB commands in gdb/mi. . . . . . . . . . . . . . gdb/mi Stack Manipulation Commands . . . . . . . . . . . . . . . gdb/mi Symbol query commands . . . . . . . . . . . . . . . . . . . . gdb/mi Target Manipulation Commands . . . . . . . . . . . . . gdb/mi thread commands . . . . . . . . . . . . . . . . . . . . . . . . . . . gdb/mi tracepoint commands . . . . . . . . . . . . . . . . . . . . . . . . gdb/mi variable objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286 288 293 296 301 303 303 Reporting Bugs in GDB . . . . . . . . . . . . . . . . 309 22.1 Have you found a bug? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309 22.2 How to report bugs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309 Appendix A Installing GDB . . . . . . . . . . . . . . . . 313 A.1 Compiling GDB in another directory . . . . . . . . . . . . . . . . . . . 314 A.2 Specifying names for hosts and targets . . . . . . . . . . . . . . . . . 315 A.3 configure options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316 Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
Introduction The usual implementation of malloc and free are unforgiving to errors in their callers' code, including cases where the programmer overflows an array, forgets to free memory, or frees a memory block twice. This often does not affect the program immediately, waiting until the corrupted memory is used later (in the case of overwrites) or gradually accumulating allocated but unused blocks. Thus, debugging can be extremely difficult. In this assignment, you will write a wrapper for the malloc package that will catch errors in the code that calls malloc and free. The skills you will have learned upon the completion of this exercise are pointer arithmetic and a greater understanding of the consequences of subtle memory mistakes. Logistics Unzip debugging_malloc.zip into an empty directory. The files contained are as follows: File(s): Function: debugmalloc.c Contains the implementation of the three functions you will be writing. This is the one file you will be editing and handing in. debugmalloc.h Contains the declaration of the functions, as well as the macros that will call them. driver.c Contains main procedure and the code that will be calling the functions in the malloc package dmhelper.c, dmhelper.h Contain the helper functions and macros that you will be calling from your code grader.pl Perl script that runs your code for the various test cases and gives you feedback based on your current code debugmalloc.dsp Exercise 3 project file debugmalloc.dsw Exercise 3 workspace file tailor.h, getopt.c, getopt.h Tools that are used only by the driver program for I/O purposes. You will not need to know what the code in these files do. Others Required by Visual C++. You do not need to understand their purpose Specification Programs that use this package will call the macros MALLOC and FREE. MALLOC and FREE are used exactly the same way as the malloc() and free() functions in the standard C malloc package. That is, the line void *ptr = MALLOC ( n ) ;will allocate a payload of at least n bytes, and ptr will point to the front of this block. The line FREE(ptr);will cause the payload pointed to by ptr to be deallocated and become available for later use. The macros are defined as follows: #define MALLOC(s) MyMalloc(s, __FILE__, __LINE__) #define FREE(p) MyFree(p, __FILE__, __LINE__) The __FILE__ macro resolves to the filename and __LINE__ resolves to the current line number. The debugmalloc.c file contains three functions that you are required to implement, as shown: void *MyMalloc(size_t size, char *filename, int linenumber); void MyFree(void *ptr, char *filename, int linenumber); int AllocatedSize(); Using the macros above allow MyMalloc and MyFree to be called with the filename and line number of the actual MALLOC and FREE calls, while retaining the same form as the usual malloc package. By default, MyMalloc and MyFree() simply call malloc() and free(), respectively, and return immediately. AllocatedSize() should return the number of bytes currently allocated by the user: the sum of the requested bytes through MALLOC minus the bytes freed using FREE. By default, it simply returns 0 and thus is unimplemented. The definitions are shown below: void *MyMalloc(size_t size, char *filename, int linenumber) { return (malloc(size)); } void MyFree(void *ptr, char *filename, int linenumber) { free(ptr); } int AllocatedSize() { return 0; } Your job is to modify these functions so that they will catch a number of errors that will be described in the next section. There are also two optional functions in the debugmalloc.c file that you can implement: void PrintAllocatedBlocks(); int HeapCheck(); PrintAllocatedBlocks should print out information about all currently allocated blocks. HeapCheck should check all the blocks for possible memory overwrites. Implementation Details To catch the errors, you will allocate a slightly larger amount of space and insert a header and a footer around the "requested payload". MyMalloc() will insert information into this area, and MyFree() will check to see if the information has not changed. The organization of the complete memory block is as shown below: Header Checksum ... Fence Payload Footer Fence Note:MyMalloc() returns a pointer to the payload, not the beginning of the whole block. Also, the ptr parameter passed into MyFree(void *ptr) will point to the payload, not the beginning of the block. Information that you might want to store in this extra (header, footer) area include: a "fence" immediately around the requested payload with a known value like 0xCCDEADCC, so that you can check if it has been changed when the block is freed. the size of the block a checksum for the header to ensure that it has not been corrupted (A checksum of a sequence of bits is calculated by counting the number of "1" bits in the stream. For example, the checksum for "1000100010001000" is 4. It is a simple error detection mechanism.) the filename and line number of the MALLOC() call The errors that can occur are: Error #1: Writing past the beginning of the user's block (through the fence) Error #2: Writing past the end of the user's block (through the fence) Error #3: Corrupting the header information Error #4: Attempting to free an unallocated or already-freed block Error #5: Memory leak detection (user can use ALLOCATEDSIZE to check for leaks at the end of the program) To report the first four errors, call one of these two functions: void error(int errorcode, char *filename, int linenumber); errorcode is the number assigned to the error as stated above. filename and linenumber contain the filename and line number of the line (the free call) in which the error is invoked. For example, call error(2, filename, linenumber) if you come across a situation where the footer fence has been changed. void errorfl(int errorcode, char *filename_malloc, int linenumber_malloc, char *filename_free, int linenumber_free); This is the same as the error(), except there are two sets of filenames and line numbers, one for the statement in which the block was malloc'd, and the other for the statement in which the block was free'd (and the error was invoked). The fact that MyMalloc() and MyFree() are given the filename and line number of the MALLOC() and FREE() call can prove to be very useful when you are reporting errors. The more information you print out, the easier it will be for the programmer to locate the error. Use errorfl() instead of error() whenever possible. errorfl() obviously cannot be used on situations where FREE() is called on an unallocated block, since it was not ever MALLOC'd. Note: You will only be reporting errors from MyFree(). None of the errors can be caught in MyMalloc() In the case of memory leaks, the driver program will call AllocatedSize(), and the grader will look at its return value and possible output. AllocatedSize() should return the number of bytes currently allocated from MALLOC and FREE calls. For example, the code segment: void *ptr1 = MALLOC(10), *ptr2 = MALLOC(8); FREE(ptr2); printf("%d\n", AllocatedSize()); should print out "10". Once you have gotten to the point where you can catch all of the errors, you can go an optional step further and create a global list of allocated blocks. This will allow you to perform analysis of memory leaks and currently allocated memory. You can implement the void PrintAllocatedBlocks() function, which prints out the filename and line number where all currently allocated blocks were MALLOC()'d. A macro is provided for you to use to print out information about a single block in a readable and gradeable format: PRINTBLOCK(int size, char *filename, int linenumber) Also, you can implement the int HeapCheck() function. This should check all of the currently allocated blocks and return -1 if there is an error and 0 if all blocks are valid. In addition, it should print out the information about all of the corrupted blocks, using the macro #define PRINTERROR(int errorcode, char *filename, int linenumber), with errorcode equal to the error number (according to the list described earlier) the block has gone through. You may find that this global list can also allow you to be more specific in your error messages, as it is otherwise difficult to determine the difference between an overwrite of a non-payload area and an attempted FREE() of an unallocated block. Evaluation You are given 7 test cases to work with, plus 1 extra for testing a global list. You can type "debugmalloc -t n" to run the n-th test. You can see the code that is being run in driver.c. If you have Perl installed on your machine, use grader.pl to run all the tests and print out a table of results. There are a total of 100 possible points. Here is a rundown of the test cases and desired output (do not worry about the path of the filename): Test case #1 Code char *str = (char *) MALLOC(12); strcpy(str, "123456789"); FREE(str); printf("Size: %d\n", AllocatedSize()); PrintAllocatedBlocks(); Error # None Correct Output Size: 0 Points worth 10 Details 10 points for not reporting an error and returning 0 in AllocatedSize() Test case #2 Code char *str = (char *) MALLOC(8); strcpy(str, "12345678"); FREE(str); Error # 2 Correct Output Error: Ending edge of the payload has been overwritten. in block allocated at driver.c, line 21 and freed at driver.c, line 23 Points worth 15 Details 6 pts for catching error 3 pts for printing the filename/line numbers 6 pts for correct error message Test case #3 Code char *str = (char *) MALLOC(2); strcpy(str, "12"); FREE(str); Error # 2 Correct Output Error: Ending edge of the payload has been overwritten. in block allocated at driver.c, line 28 and freed at driver.c, line 30 Points worth 15 Details 6 pts for catching error 3 pts for printing the filename/line numbers 6 pts for correct error message Test case #4 Code void *ptr = MALLOC(4); *ptr2 = MALLOC(6); FREE(ptr); printf("Size: %d\n", AllocatedSize()); PrintAllocatedBlocks(); Error # None Correct Output Size: 6 Currently allocated blocks: 6 bytes, created at driver.c, line 34 Points worth 15 Details 15 pts for not reporting an error and returning 6 from AllocatedSize Extra for printing out the extra block Test case #5 Code void *ptr = MALLOC(4); FREE(ptr); FREE(ptr); Error # 4 Correct Output Error: Attempting to free an unallocated block. in block freed at driver.c, line 43 Points worth 15 Details 15 pts for catching error Extra for correct error message Test case #6 Code char *ptr = (char *) MALLOC(4); *((int *) (ptr - 8)) = 8 + (1 << 31); FREE(ptr); Error # 1 or 3 Correct Output Error: Header has been corrupted.or Error: Starting edge of the payload has been overwritten. in block allocated at driver.c, line 47 and freed at driver.c, line 49 Points worth 15 Details 9 pts for catching error 6 pts for a correct error message Test case #7 Code char ptr[5]; FREE(ptr); Error # 4 Correct Output Error: Attempting to free an unallocated block. in block freed at driver.c, line 54 Points worth 15 Details 15 pts for recognizing error Extra for printing correct error message Test case #8 (Optional) Code int i; int *intptr = (int *) MALLOC(6); char *str = (char *) MALLOC(12); for(i = 0; i < 6; i++) { intptr[i] = i; } if (HeapCheck() == -1) { printf("\nCaught Errors\n"); } Error # None Correct Output Error: Ending edge of the payload has been overwritten. Invalid block created at driver.c, line 59 Caught Errors Points worth Extra Details "Caught Errors" indicates that the HeapCheck() function worked correctly. Extra points possible. Your instructor may give you extra credit for implementing a global list and the PrintAllocatedBlocks() and HeapCheck() functions.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值