segmentation faults
play

Segmentation Faults Otherwise known as segfaults. Occur when you - PowerPoint PPT Presentation

Segmentation Faults Otherwise known as segfaults. Occur when you try to access memory that you don't have permission to. Results in one of the least-informative error messages when using gcc. It is often more useful to be told the


  1. Segmentation Faults � Otherwise known as segfaults. � Occur when you try to access memory that you don't have permission to. � Results in one of the least-informative error messages when using gcc. � It is often more useful to be told the line on which the segfault occurs. � GDB is a tool which you can use to debug C code, which tells you what line the segfault occurred on.

  2. GDB � GDB allows you to do many things: � Pause your code at any time. � Print the contents of any existing variables at that point in the code. � Step through your code executing each line individually before pausing again. � Find out what line of your code caused that annoying segmentation fault. (Note: the line that caused the segmentation fault, is often not the line which has the error).

  3. Using GDB 1.Compile using the -g flag: • % gcc -Wall -Werror -g -o binaryFile myFile.c 2.Start gdb: • % gdb binaryFile 3.To run your program: • (gdb) run 4.To quit: • (gdb) quit • Note the change in prompt symbol when gdb is running.

  4. GDB Useful Commands � To stop a program during execution: � Break <line number or function name> � To view contents of variables at current point: � Print <variable name> � To keep going: � Continue n � Step n - goes into functions � Next n - steps over functions � To view the stack (useful at seg faults) ‏ � Where

  5. Other Useful Commands � To see the code around the line you're currently at: � List

  6. GDB Examples � llsegfault.c � cause: derefrencing null pointer � segfault line num � print i curr � stackoverflow.c � cause: running out of memory by recursive non- ending function calls � where � backtraceExample.c � where

  7. DDD - graphical GDB � DDD has the same commands as gdb, but is graphical. � One of the main advantages of this is the ability to visually represent data structures.

  8. Viewing Data Structures with DDD � Compile with -g flag. � Run ddd: � % ddd binaryFile � Set a breakpoint at the point that you want to view the data structure: � break <line number> OR � drag the breakpoint image onto the line you want to break at � Run the program: � (gdb) run

  9. Viewing Data Structures with DDD (cntd) ‏ � When the breakpoint is reached: � If you can't see the place where data structures would be drawn, select View->Data Window. � Right click in the data window and select 'New Display'. � Enter the variable name that you want to draw a picture of and press enter. � Wherever you see ... it means you can expand the data structure. Do this by double clicking on the ... .

  10. DDD Examples � aircraft.c (Lab 6) ‏

  11. Segfaults: a deeper view � Another handy tool is: Electric Fence. � First, some background as to why it is handy.

  12. SegFaults (ctnd) ‏ � Ask for a piece of memory of the right size: � malloc(sizeof(int));

  13. SegFaults (ctnd) ‏ � The memory is allocated.

  14. SegFaults (ctnd) ‏ � When only a small piece of memory is required, instead of providing only that small piece, the operating system gives the user access to a whole page of memory. � Further mallocs will return other sections of this same page.

  15. SegFaults (ctnd) ‏ � A segfault occurs when the user tries to access the red section of memory. � Eg, if you malloc an array, and go 1 or 2 indexes off the end, you may never get a segfault.

  16. SegFaults (ctnd) ‏ � But you don't know that it will never segfault.

  17. Electric Fence � If you try to access memory that's on the same page in memory, as something you've malloced, then no segfault will occur. � But, if you've accessed memory that you haven't malloced, you want to know sooner rather than later (when it wreaks havoc on your program). � Electric Fence is a program which causes segfaults to happen whenever you access memory in the heap that you haven't malloced.

  18. Using Electric Fence � Compile with -g and -lefence flags: � % gcc -lefence -g -o binaryFile myFile.c � Run the program within gdb: � % gdb binaryFile � (gdb) run

  19. Valgrind � When you want to check if you've freed everything you've malloced. � Using Valgrind: � Compile your program with -g flag. � Pass your file into valgrind: � % valgrind --leak-check=full ./binaryFile � The output will summerise any memory leaks and violations. This includes memory blocks that have been malloced, but not freed. � The flag --leak-check=full means that it tells you where you malloced something that you forgot to free.

  20. Valgrind Demos � valgrindDemo.c

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend