Using fix and continue |
10 |
![]() |
This chapter is organized into the following sections:
Basic Concepts
The fix and continue feature allows you to modify and recompile a source file and continue executing without rebuilding the entire program. By updating the .o files and splicing them into your program, you don't need to relink.
Note - Do not use fix if a build is in process; the output from the two processes will intermingle in the Building window.
Once fix has been invoked, dbx calls the compiler with the appropriate compiler options. The modified files are compiled and shared object (.so) files are created. Semantic tests are done by comparing the old and new files.
The new object file is linked to your running process using the runtime linker. If the function on top of the stack is being fixed, the new stopped in function is the beginning of the same line in the new function. All the breakpoints in the old file are moved to the new file.
You can use fix and continue on files that have been compiled with or without debugging information, but there are some limitations in the functionality of fix and continue for files originally compiled without debugging information. See the -g option description for more information.
You can fix shared objects (.so) files, but they have to be opened in a special mode. You can use either RTLD_NOW|RTLD_GLOBAL or RTLD_LAZY|RTLD_GLOBAL in the call to dlopen.
fix does not make the changes within your executable file, but only changes the .o files and the memory image. Once you have finished debugging a program, you need to rebuild your program to merge the changes into the executable. When you quit debugging, a message reminds you to rebuild your program.
Before resuming program execution, you should be aware of the following conditions:
There are several ways to solve this problem:
The following example shows how a simple bug can be fixed. The application gets a segmentation violation in line 6 when trying to dereference a NULL pointer:
Change line 14 to copy to buf instead of 0 and save the file, then do a fix:
14 copy(buf); <=== modified line (dbx) fix fixing "testfix.cc" ..... pc moved to "testfix.cc":6 stopped in copy at line 6 in file "testfix.cc" 6 while ((*to++ = *from++) != '\0') |
(dbx) pop stopped in main at line 14 in file "testfix.cc" 14 copy(buf); |
(dbx) assign from = from-1 |
Command Reference
The fix command takes the following options:
fix [options] [file1, file2,...] |
If fix is invoked with an option other than -a and without a filename argument, only the current modified source file is fixed.
Note - Sometimes it may be necessary to modify a header (.h) file as well as a source file. To be sure that the modified header file is accessed by all source files in the program that include it, you must give as an argument to the fix command a list of all the source files that include that header file. If you do not include the list of source files, only the primary source file is recompiled and only it includes the modified version of the header file. Other source files in the program continue to include the original version of that header file.
When fix is invoked, the current working directory of the file that was current at the time of compilation is searched before executing the compilation line. There might be problems locating the correct directory due to a change in the file system structure from compilation time to debugging time. To avoid this problem, use the command pathmap, which creates a mapping from one pathname to another. Mapping is applied to source paths and object file paths.
Note - C++ template definitions cannot be fixed directly. Fix the files with the template instances instead. You can use the -f option to overwrite the date-checking if the template definition file has not changed. dbx looks for template definition .o files in the default repository directory Templates.DB. The
-ptr compiler switch is not supported by the fix command in dbx.