Article Title: Causes of Memory Errors in Linux and debugging methods. Linux is a technology channel of the IT lab in China. Including desktop applications, Linux system management, kernel research, embedded systems, open-source, and other basic categories. To sum up, if a segment error occurs, the system accesses the wrong memory segment. Generally, you do not have the permission, or there is no corresponding physical memory at all, especially when the access address is 0.
Generally, a segment error means that the accessed memory exceeds the memory space of the program provided by the system. Generally, this value is saved by gdtr, which is a 48-bit register, the 32-bit table stores the gdt table pointed to by it, and the last 13 BITs are saved to the corresponding gdt subscript, the last three digits include whether the program is in the memory and the running level of the program in the cpu. The gdt pointing to is a table in 64 bits, this table stores the code segment for running the program, the starting address of the data segment, the corresponding segment limit and page switch, the program running level, and the memory granularity. Once an out-of-bounds access occurs to a program, the cpu will generate corresponding exception protection, so segmentation fault will appear.
In programming, the following methods may easily cause segment errors, which are basically caused by incorrect pointer usage.
1) access the system data zone, especially writing data to the memory address protected by the System
The most common is to give a pointer A 0 address
2) memory out of bounds (array out of bounds, variable types inconsistent, etc.) access to areas not in your memory
Solution
When we write programs in C/C ++, most of the work of memory management needs to be done. In fact, memory management is a tedious task. No matter how clever you are and how experienced you are, it's hard to avoid making minor mistakes here, these errors are usually so simple and easy to eliminate. However, manual debugging is often inefficient and annoying, this article will talk about how to quickly locate these "segment errors" statements about memory access out-of-bounds errors.
The following describes several debugging methods for a program with a segment error:
1 dummy_function (void) 2 { 3 unsigned char * ptr = 0x00; 4 * ptr = 0x00; 5} 6 7 int main (void) 8 { 9 dummy_function (); 10 11 return 0; 12} |
As a skilled C/C ++ programmer, the bug of the above Code should be very clear, because it tries to operate on the memory area with the address 0, this memory area is usually inaccessible, and of course there will be errors. Let's compile and run it:
Xiaosuo @ gentux test $./a. out Segment Error |
As expected, it went wrong and exited. 1. Use gdb to gradually find the segment error:
This method is also widely known and widely used. First, we need an executable program with debugging information. Therefore, we add the "-g-rdynamic" parameter to compile the program, use gdb to debug and run the newly compiled program. The specific steps are as follows:
Xiaosuo @ gentux test $ gcc-g-rdynamic d. c Xiaosuo @ gentux test $ gdb./a. out GNU gdb 6.5 Copyright (C) 2006 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are Welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i686-pc-linux-gnu"... Using host libthread_db library "/lib/libthread_db.so.1 ".
(Gdb) r Starting program:/home/xiaosuo/test/a. out
Program received signal SIGSEGV, Segmentation fault. 0x08048524 in dummy_function () at d. c: 4 4 * ptr = 0x00; (Gdb) |
It seems that we did not need to debug step by step to find the Error Path line 4th of the d. c file, which is actually so simple.
We also found that the process ended with the SIGSEGV signal. After further reading the document (man 7 signal), we know that the default handler action of SIGSEGV is to print the error message of "segment error" and generate a Core file, therefore, method 2 is generated. 2. Analyze the Core file:
What is a Core file?
The default action of certain signals is to cause a process to terminate and produce a core dump file, a disk file containing an image of the process's memory at the time of termination. A list of the signals which cause a process to dump core can be found in signal (7 ). |
The core file is not found on my system. Later, I recalled that in order to gradually reduce the number of pull files on the system, the generation of core files was forbidden. I checked that the core file size of the system was limited to kb, try again:
Xiaosuo @ gentux test $ ulimit-c 0 Xiaosuo @ gentux test $ ulimit-c 1000 Xiaosuo @ gentux test $ ulimit-c 1000 Xiaosuo @ gentux test $./a. out Segment error (core dumped) Xiaosuo @ gentux test $ ls A. out core d. c f. c g. c pango. c test_iconv.c test_regex.c |
The core file is finally generated. Use gdb to debug it:
Xiaosuo @ gentux test $ gdb./a. out core GNU gdb 6.5 Copyright (C) 2006 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are Welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i686-pc-linux-gnu"... Using host libthread_db library "/lib/libthread_db.so.1 ".
Warning: Can't read pathname for load map: input/output error. Reading symbols from/lib/libc. so.6...... done. Loaded symbols for/lib/libc. so.6 Reading symbols from/lib/ld-linux.so.2... done. Loaded symbols for/lib/ld-linux.so.2 Core was generated by './a. out '. Program terminated with signal 11, Segmentation fault. #0 0x08048524 in dummy_function () at d. c: 4 4 * ptr = 0x00; |
[1] [2] [3] Next page