Gdb For Mac Os X
2021年3月2日Download here: http://gg.gg/ohz57
*Gdb For Mac Os X 10.8
*Gdb For Mac Os X64
GDB Installation on Mac OS X. If you work on a Mac OS X 10.9 Mavericks or later, you will run into the problem of Eclipse refusing to interactively debug problems that otherwise build and run fine: An attempt to start a debugging session by selecting Run.
*Hi all, some of you may know me from GDB, and a few with long memories may remember that I did a couple Mac ports of GNU a while back (those silly mpw-. files scattered everywhere are my fault). I’ve just started working for Apple’s Mac OS X tools team. This may come as a surprise, but Mac OS X is basically FreeBSD 3.2 with a GUI.
*For example, the gcc under Mac OS also supports -Os and -Oz to allow optimization for code size. For other optimization/debug options, you may use man gcc; under any UNIX-like system. Gcc is a debugger by GNU project. Gdb can step through your source code line.
*Mac OS X is the long-term direction of Apple, and GDB will be the core debugger on Mac OS X for the foreseeable future. It behooves you to learn GDB now rather than later. GDB, as its full name suggests, is primarily a source-level debugger.
*The Mac OS X Debugging Magic Technote contains a wealth of information about various debugging options built in to macOS. IMPORTANT: By default, Xcode has the ’Load Symbols Lazily’ preference set. As a result, any symbols not in the main static library (99%.[bugs][GDB Maintainers][contributing][current git][documentation][download][home][irc][links][mailing lists][news][schedule][song][wiki]GDB: The GNU Project DebuggerWhat is GDB?
GDB, the GNU Project debugger, allows you to see what is going on`inside’ another program while it executes -- or what another programwas doing at the moment it crashed.
GDB can do four main kinds of things (plus other things in supportof these) to help you catch bugs in the act:
*Start your program, specifying anything that might affect its behavior.
*Make your program stop on specified conditions.
*Examine what has happened, when your program has stopped.
*Change things in your program, so you can experiment withcorrecting the effects of one bug and go on to learn about another.Those programs might be executing on the same machine as GDB (native),on another machine (remote), or on a simulator. GDB can run on mostpopular UNIX and Microsoft Windows variants, as well as on Mac OS X.What Languages does GDB Support?GDB supports the following languages (in alphabetical order):
* Ada
* Assembly
* C
* C++
* D
* Fortran
* Go
* Objective-C
* OpenCL
* Modula-2
* Pascal
* RustGDB version 10.1Version 10.1 of GDB, the GNUDebugger, is now available for download. See the ANNOUNCEMENT for detailsincluding changes in this release.
An errata list (PROBLEMS) and documentationare also available.NewsOctober 24th, 2020: GDB 10.1 Released!
The latest version of GDB, version 10.1, is available for download.
This version of GDB includes the following changes and enhancements:
* Support for debugging new targets:
* BPF (bpf-unknown-none)
* GDBserver support for the following targets:
* ARC GNU/Linux
* RISC-V GNU/Linux
* Multi-target debugging support (experimental)
* Support for debuginfod, an HTTP server for distributing ELF/DWARF debugging information as well as source code.
* Support for debugging a 32-bit Windows program using a 64-bit Windows GDB.
* Support for building GDB with GNU Guile 3.0 and 2.2 (in addition to 2.0)
* Improved performance during startup through the use of threading during symbol table loading (an optional feature in GDB 9, now enabled by default in GDB 10).
* Various enhancements to the Python and Guile APIs
* Various TUI Mode fixes and enhancements.
* Other miscellaneous enhancements:
* Detection when attaching to a process of a mismatch between this process and the executable previously loaded into GDB.
* Support for default arguments for ’alias’ commands.
* GDBserver support for the following host triplets has been removed:
*i[34567]86-*-lynxos*
*powerpc-*-lynxos*
*i[34567]86-*-nto*
*bfin-*-*linux*
*crisv32-*-linux*
*cris-*-linux*
*m32r*-*-linux*
*tilegx-*-linux*
*arm*-*-mingw32ce*
*i[34567]86-*-mingw32ce* See the NEWS file for a more complete and detailed list of what this release includes.September 13th, 2020: GDB 10 branch created
The GDB 10 branch (gdb-10-branch) has been created.To check out a copy of the branch use:Gdb For Mac Os X 10.8May 23rd, 2020: GDB 9.2 Released!
The latest version of GDB, version 9.2, is available for download.
This is a minor corrective release over GDB 9.1, fixing the followingissues:
*PR tui/25586 (Resizing the source/disassembly or command window produces corrupted display)
*PR gdb/25650 (GDB can’t ’printf’ a convenience variable holding an inferior address)
*PR build/25981 (Use of short i386 register names breaks compilation on recent Solaris 11.4)
*PR symtab/26003 (infinite loop loading symbols from separate debug objfile)
*PR build/26029 (GDB build failure on SPARC)Nov 28, 2006: Reversible Debugging
The GDB maintainers are looking for contributors interestedin reversible debugging.Late breaking information, such as recently added features, can befound in the NEWS file in the gdb source tree. Old announcements are in thenews archive.[bugs][GDB Maintainers][contributing][current git][documentation][download][home][irc][links][mailing lists][news][schedule][song][wiki]
Please send FSF & GNU inquiries & questions to gnu@gnu.org. There are also other ways tocontact the FSF.
This page is maintained by the GDBdevelopers. Download mozilla firefox for mac os x.
Copyright Free Software Foundation, Inc., 51 Franklin St - FifthFloor, Boston, MA 02110-1301 USA.
Verbatim copying and distribution of this entire article ispermitted in any medium, provided this notice is preserved.
Last modified 2020-10-24.Gdb For Mac Os X64For Developers > How-Tos > Debugging Chromium on macOSResources:
Contents
*4 Debugging the renderer process
*11 Debugging in Release ModeThe Mac OS X Debugging Magic Technote contains a wealth of information about various debugging options built in to macOS.
IMPORTANT: By default, Xcode has the ’Load Symbols Lazily’ preference set. As a result, any symbols not in the main static library (99% of our code) won’t be visible to set breakpoints. The result is that you set breakpoints in the editor window and they’re ignored entirely when you run. The fix, however, is very simple! Uncheck the ’Load Symbols Lazily’ checkbox in the ’Debugging’ panel in preferences. Now all your breakpoints will work, at the expense of a little longer load time in gdb. Well worth it, if you ask me.ALSO IMPORTANT: If you include fast_build=1 in your GYP_DEFINES, there is an excellent chance the symbols you’ll need for debugging will be stripped! You may save yourself a lot of heartache if you remove this, rerun gyp_chromium and rebuild before proceeding.
Disabling ReportCrash
macOS helpfully tries to write a crash report every time a binary crashes – which happens for example when a test in unit_tests fails. Since Chromium’s debug binaries are huge, this takes forever. If this happens, ’ReportCrash’ will be the top cpu consuming process in Activity Monitor. You should disable ReportCrash while you work on Chromium. Run man ReportCrash to learn how to do this on your version of macOS. On 10.8, the command is
launchctl unload -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.ReportCrash.Root.plist
Yes, you need to run this for both the normal user and the admin user.
Processing Apple Crash Reports
If you get a Google Chrome crash report caught by ReportCrash/OS X, it will not have symbols (every frame will be ChromeMain). To get a symbolized stack trace, use the internal crsym tool by simply pasting the contents of an entire Apple crash report.Debugging the renderer processXcode’s built in gdb wrapper doesn’t allow you to debug more than one process at once and doesn’t deal very well with debugging Chrome’s subprocesses directly. There are two different ways around this:(a) Run Chrome in a single process(NOTE: this option is not recommended any more -- Chrome’s single-process mode is neither supported nor tested.)
*Edit the Executable settings for the Chromium app (make it the current executable, then choose Project > Edit Active Executable).
*Switch to the Arguments tab and press the ’+’ button under the arguments list
*Type ’--single-process’ in the list.From now on Chromium will launch in single-process mode when invoked through this Xcode project, and the debugger will work fine. This obviously changes the apps behavior slightly, but for most purposes the differences aren’t significant. If they are, though, you’ll need to…(b) or, Attach Xcode’s debugger to a renderer process after launch1. Launch the main executable from the Terminal (not through Xcode) and pass in the --renderer-startup-dialog flag on the command line. On macOS this causes the renderer to print a message with its PID and then call pause() immediately up on startup. This has the effect of pausing execution of the renderer until the process receives a signal (such as attaching the debugger).e.g.
$ ~/dev/chrome//src/xcodebuild/Debug/Chromium.app/Contents/MacOS/Chromium --renderer-startup-dialog
[33215:2055:244180145280185:WARNING:/Users/Shared/bla/chrome/src/chrome/renderer/renderer_main.cc(48)] Renderer (33215) paused waiting for debugger to attach @ pid
So 33215 is the PID of the renderer process in question.2. Open chrome.xcodeproj in Xcode and select Run -> Attach To Process -> Process ID . Debugging out-of-process tests:Similar to debugging the renderer process, simply attaching gdb to a out-of-process test like browser_tests will not hit the test code. In order to debug a browser test, you need to run the test binary with ’--single_process’ (note the underscore in single_process). Because you can only run one browser test in the same process, you’re probably going to need to add --gtest_filter as well. So your command will look like this:/path/to/src/xcodebuild/Debug/browser_tests --single_process --gtest_filter=GoatTeleporterTest.DontTeleportSheepUI DebuggingFor UI Debugging, F-Script Anywhere is very useful. Read https://sites.google.com/a/chromium.org/dev/developers/f-script-anywhere for more information.Building with Ninja, Debugging with XcodeTemporarily disabling the SandboxDisabling the sandbox can sometimes be useful when debugging, this can be achieved by passing the --no-sandbox flag on the command line. This will, for example, allow writing out debugging information to a file from the Renderer Process.e.g.
$ ~/dev/chrome//src/xcodebuild/Debug/Chromium.app/Contents/MacOS/Chromium --no-sandbox
Tips on Debugging the Renderer SandboxLaunch chrome with the --enable-sandbox-logging flag. This will cause a message to be printed to /var/log/system.log every time an operation is denied by the Sandbox (you can use Console.app to watch logfiles). This is really useful for debugging and can often provide an explanation for very puzzling problems.You can also get the Sandbox to send a SIGSTOP to a process when the sandbox denies functionality. This allows you to attach with a debugger and continue the execution from where it left off:$ sandbox-exec -p ’(version 1) (allow default) (deny file-write* (regex ’foo’) (with send-signal SIGSTOP))’ touch fooBreakpoints Not Getting Hit in gdbIf a breakpoint you set isn’t causing the debugger to stop, try one of these solutions:
*Uncheck ’Load symbols lazily’ In the Xcode->Preferences->Debugging dialog.
*Manually insert a call to Debugger() in the code, this will forcefully break into the Debugger.Debugging in Release ModePreserving symbols in Release buildsProfiling tools like Shark and ’sample’ expect to find symbol names in the binary, but in Release builds most symbols are stripped out. You can preserve symbols by temporarily changing the build process, by adding mac_strip_release=0 to your GYP_DEFINES, rerunning gclient runhooks, and rebuilding (changing this define only relinks the main binary, it doesn’t recompile everything).(The above ’Debugging in Release Mode’ trick with the .dSYM file might work for Shark/sample too; I haven’t tried it yet. —snej)Using DTracejgm’s awesome introductory article:
http://www.mactech.com/articles/mactech/Vol.23/23.11/ExploringLeopardwithDTrace/index.html
Defining static probes on macOS:
http://www.macresearch.org/tuning-cocoa-applications-using-dtrace-custom-static-probes-and-instruments
http://www.brendangregg.com/dtrace.html#Examples
http://blogs.sun.com/bmc/resource/dtrace_tips.pdf
DTrace examples on macOS: /usr/share/examples/DTTk
To get truss on macOS, use dtruss. That requires root, so I often sudo dtruss -p and attach to a running nonroot program.
Testing other localesTo test Chrome in a different locale, change your system locale via the System Preferences. (Keep the preferences window open so that you can change the locale back without needing to navigate through menus in a language you may not know.)Memory/Heap InspectionThere are several low-level command-line tools that can be used to inspect what’s going on with memory inside a process.’heap’ summarizes what’s currently in the malloc heap(s) of a process. (It only works with regular malloc, of course, but Mac Chrome still uses that.) It shows a number of useful things:
*How much of the heap is used or free
*The distribution of block sizes
*A listing of every C++, Objective-C and CoreFoundation class found in the heap, with the number of instances, total size and average size.It identifies C++ objects by their vtables, so it can’t identify vtable-less classes, including a lot of the lower-level WebCore ones like StringImpl. To work around this I temporarily added the ’virtual’ keyword to WebCore::RefCounted’s destructor method, which forces every ref-counted object to include a vtable pointer identifying its class.
’malloc_history’ identifies the stack backtrace that allocated every malloc block in the heap. It lists every unique backtrace together with its number of blocks and their total size. It requires that the process use malloc stack logging, which is enabled if the environment variable MallocStackLogging is set when it launches. The ’env’ command is handy for this:
$ env MallocStackLogging=1 Chromium.app/Contents/MacOS/ChromiumThen in another shell you run
$ malloc_history pid -all_by_sizeWatch out: the output is big. I ran malloc_history on a fairly bloated heap and got 60MB of text.
’leaks’ finds malloc blocks that have no pointers to them and are probably leaked. It doesn’t require MallocStackLogging, but it’s more useful if it’s on because it can then show the backtrace that allocated each leaked block. (So far I’ve seen only trivial leakage in Chrome.)
’vmmap’ shows all the virtual-memory regions in the process’s address space. This is less useful since it doesn’t say anything about individual malloc blocks (except huge ones) but it can be useful for looking at things like static data size, mapped files, and how much memory is paged out. I recommend the ’-resident’ flag, which shows how much of each allocation is currently paged into RAM. See the man page for details.
Notes:
*These are not going to be very useful on stripped binaries, and they’re less useful in release builds.
*All of these except vmmap take several minutes to run, apparently because of the number of symbols in Chrome. They spend most of their time pegging one CPU down inside system code that’s reading symbol tables from the binary. Be patient.
*There are GUI apps in /Developer that do a lot of the same things, such as Instruments, MallocDebug and Shark. I (snej) personally find the command-line tools easier to understand, but YMMV.Working with minidumpsCrMallocErrorBreakIf you are looking at a crash report that ends in CrMallocErrorBreak, then either a malloc or free call has failed with the given stacktrace. Chromium overrides the empty function malloc_error_break in macOS’s Libc with CrMallocErrorBreak. The system calls this function as a debugging aide that we’ve made fatal because it catches useful memory errors. Specifically, CrMallocErrorBreak will be called (resulting in a crash) under the following circumstances:
*Attempting to free a pointer that was not allocated.
*Attempting to free the same pointer more than once.
*Freeing a pointer of size 0.
*Freeing an unaligned pointer.
*An internal checksum of the object being freed does not match. This usually indicates heap corruption!
*Invalid checksums on the small or tiny free list. The system maintains a list of small allocations that it reuses to speed up things like allocations in a loop. A checksum mismatch usually indicates a use-after-free, double-free, or heap corruption.
*Extra-large allocation failures. Normally all failures to allocate go through CrMallocErrorBreak but are not fatal because that is the job of Chromium’s OOM killer. Extra-large allocations go through a different path and are sometimes killed here instead.If you get a crash report that that ends in CrMallocErrorBreak, it is likely not an issue with this feature. It is instead surfacing a (sometimes serious) bug in your code or other code that is stomping on your code’s memory. Using Chromium’s memory tools (ASan, HeapCheck, and Valgrind) is a good start, if you can reproduce the problem.Enabling high-DPI (aka ’HiDPI’ or ’Retina’) modes on standard-DPI hardware.Under macOS 10.7 and above it’s possible to fake ’HiDPI’ modes on standard-DPI hardware. This can be useful in testing up-scaling codepaths or high-DPI resources.
*Configure the OS to offer HiDPI modes:
*EITHER follow Apple’s instructions to enable high resolution modes:http://developer.apple.com/library/mac/#documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Testing/Testing.html.
*OR run the command-line: sudo defaults write /Library/Preferences/com.apple.windowserver DisplayResolutionEnabled -bool YES
*Open the System Preferences -> Displays panel, select Scaled mode and scroll to the bottom to see modes marked ’(HiDPI)’.Looking for gdb? It’s been replaced with lldb. Use that it instead.Taking CPU SamplesA quick and easy way to investigate slow or hung processes is to use the sample facility, which will generate a CPU sample trace. This can be done either in the Terminal with the sample(1) command or by using Activity Monitor:
*Open Activity Monitor
*Find the process you want to sample (for ’Helper’ processes, you may want to consult the Chrome Task Manager)
*Double-click on the row
*Click the Sample button in the process’s information windowAfter a few seconds, the sample will be completed. For official Google Chrome builds, the sample should be symbolized using crsym. If you do not have access to crsym, save the entire contents as a file and attach it to a bug report for later
https://diarynote-jp.indered.space
*Gdb For Mac Os X 10.8
*Gdb For Mac Os X64
GDB Installation on Mac OS X. If you work on a Mac OS X 10.9 Mavericks or later, you will run into the problem of Eclipse refusing to interactively debug problems that otherwise build and run fine: An attempt to start a debugging session by selecting Run.
*Hi all, some of you may know me from GDB, and a few with long memories may remember that I did a couple Mac ports of GNU a while back (those silly mpw-. files scattered everywhere are my fault). I’ve just started working for Apple’s Mac OS X tools team. This may come as a surprise, but Mac OS X is basically FreeBSD 3.2 with a GUI.
*For example, the gcc under Mac OS also supports -Os and -Oz to allow optimization for code size. For other optimization/debug options, you may use man gcc; under any UNIX-like system. Gcc is a debugger by GNU project. Gdb can step through your source code line.
*Mac OS X is the long-term direction of Apple, and GDB will be the core debugger on Mac OS X for the foreseeable future. It behooves you to learn GDB now rather than later. GDB, as its full name suggests, is primarily a source-level debugger.
*The Mac OS X Debugging Magic Technote contains a wealth of information about various debugging options built in to macOS. IMPORTANT: By default, Xcode has the ’Load Symbols Lazily’ preference set. As a result, any symbols not in the main static library (99%.[bugs][GDB Maintainers][contributing][current git][documentation][download][home][irc][links][mailing lists][news][schedule][song][wiki]GDB: The GNU Project DebuggerWhat is GDB?
GDB, the GNU Project debugger, allows you to see what is going on`inside’ another program while it executes -- or what another programwas doing at the moment it crashed.
GDB can do four main kinds of things (plus other things in supportof these) to help you catch bugs in the act:
*Start your program, specifying anything that might affect its behavior.
*Make your program stop on specified conditions.
*Examine what has happened, when your program has stopped.
*Change things in your program, so you can experiment withcorrecting the effects of one bug and go on to learn about another.Those programs might be executing on the same machine as GDB (native),on another machine (remote), or on a simulator. GDB can run on mostpopular UNIX and Microsoft Windows variants, as well as on Mac OS X.What Languages does GDB Support?GDB supports the following languages (in alphabetical order):
* Ada
* Assembly
* C
* C++
* D
* Fortran
* Go
* Objective-C
* OpenCL
* Modula-2
* Pascal
* RustGDB version 10.1Version 10.1 of GDB, the GNUDebugger, is now available for download. See the ANNOUNCEMENT for detailsincluding changes in this release.
An errata list (PROBLEMS) and documentationare also available.NewsOctober 24th, 2020: GDB 10.1 Released!
The latest version of GDB, version 10.1, is available for download.
This version of GDB includes the following changes and enhancements:
* Support for debugging new targets:
* BPF (bpf-unknown-none)
* GDBserver support for the following targets:
* ARC GNU/Linux
* RISC-V GNU/Linux
* Multi-target debugging support (experimental)
* Support for debuginfod, an HTTP server for distributing ELF/DWARF debugging information as well as source code.
* Support for debugging a 32-bit Windows program using a 64-bit Windows GDB.
* Support for building GDB with GNU Guile 3.0 and 2.2 (in addition to 2.0)
* Improved performance during startup through the use of threading during symbol table loading (an optional feature in GDB 9, now enabled by default in GDB 10).
* Various enhancements to the Python and Guile APIs
* Various TUI Mode fixes and enhancements.
* Other miscellaneous enhancements:
* Detection when attaching to a process of a mismatch between this process and the executable previously loaded into GDB.
* Support for default arguments for ’alias’ commands.
* GDBserver support for the following host triplets has been removed:
*i[34567]86-*-lynxos*
*powerpc-*-lynxos*
*i[34567]86-*-nto*
*bfin-*-*linux*
*crisv32-*-linux*
*cris-*-linux*
*m32r*-*-linux*
*tilegx-*-linux*
*arm*-*-mingw32ce*
*i[34567]86-*-mingw32ce* See the NEWS file for a more complete and detailed list of what this release includes.September 13th, 2020: GDB 10 branch created
The GDB 10 branch (gdb-10-branch) has been created.To check out a copy of the branch use:Gdb For Mac Os X 10.8May 23rd, 2020: GDB 9.2 Released!
The latest version of GDB, version 9.2, is available for download.
This is a minor corrective release over GDB 9.1, fixing the followingissues:
*PR tui/25586 (Resizing the source/disassembly or command window produces corrupted display)
*PR gdb/25650 (GDB can’t ’printf’ a convenience variable holding an inferior address)
*PR build/25981 (Use of short i386 register names breaks compilation on recent Solaris 11.4)
*PR symtab/26003 (infinite loop loading symbols from separate debug objfile)
*PR build/26029 (GDB build failure on SPARC)Nov 28, 2006: Reversible Debugging
The GDB maintainers are looking for contributors interestedin reversible debugging.Late breaking information, such as recently added features, can befound in the NEWS file in the gdb source tree. Old announcements are in thenews archive.[bugs][GDB Maintainers][contributing][current git][documentation][download][home][irc][links][mailing lists][news][schedule][song][wiki]
Please send FSF & GNU inquiries & questions to gnu@gnu.org. There are also other ways tocontact the FSF.
This page is maintained by the GDBdevelopers. Download mozilla firefox for mac os x.
Copyright Free Software Foundation, Inc., 51 Franklin St - FifthFloor, Boston, MA 02110-1301 USA.
Verbatim copying and distribution of this entire article ispermitted in any medium, provided this notice is preserved.
Last modified 2020-10-24.Gdb For Mac Os X64For Developers > How-Tos > Debugging Chromium on macOSResources:
Contents
*4 Debugging the renderer process
*11 Debugging in Release ModeThe Mac OS X Debugging Magic Technote contains a wealth of information about various debugging options built in to macOS.
IMPORTANT: By default, Xcode has the ’Load Symbols Lazily’ preference set. As a result, any symbols not in the main static library (99% of our code) won’t be visible to set breakpoints. The result is that you set breakpoints in the editor window and they’re ignored entirely when you run. The fix, however, is very simple! Uncheck the ’Load Symbols Lazily’ checkbox in the ’Debugging’ panel in preferences. Now all your breakpoints will work, at the expense of a little longer load time in gdb. Well worth it, if you ask me.ALSO IMPORTANT: If you include fast_build=1 in your GYP_DEFINES, there is an excellent chance the symbols you’ll need for debugging will be stripped! You may save yourself a lot of heartache if you remove this, rerun gyp_chromium and rebuild before proceeding.
Disabling ReportCrash
macOS helpfully tries to write a crash report every time a binary crashes – which happens for example when a test in unit_tests fails. Since Chromium’s debug binaries are huge, this takes forever. If this happens, ’ReportCrash’ will be the top cpu consuming process in Activity Monitor. You should disable ReportCrash while you work on Chromium. Run man ReportCrash to learn how to do this on your version of macOS. On 10.8, the command is
launchctl unload -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.ReportCrash.Root.plist
Yes, you need to run this for both the normal user and the admin user.
Processing Apple Crash Reports
If you get a Google Chrome crash report caught by ReportCrash/OS X, it will not have symbols (every frame will be ChromeMain). To get a symbolized stack trace, use the internal crsym tool by simply pasting the contents of an entire Apple crash report.Debugging the renderer processXcode’s built in gdb wrapper doesn’t allow you to debug more than one process at once and doesn’t deal very well with debugging Chrome’s subprocesses directly. There are two different ways around this:(a) Run Chrome in a single process(NOTE: this option is not recommended any more -- Chrome’s single-process mode is neither supported nor tested.)
*Edit the Executable settings for the Chromium app (make it the current executable, then choose Project > Edit Active Executable).
*Switch to the Arguments tab and press the ’+’ button under the arguments list
*Type ’--single-process’ in the list.From now on Chromium will launch in single-process mode when invoked through this Xcode project, and the debugger will work fine. This obviously changes the apps behavior slightly, but for most purposes the differences aren’t significant. If they are, though, you’ll need to…(b) or, Attach Xcode’s debugger to a renderer process after launch1. Launch the main executable from the Terminal (not through Xcode) and pass in the --renderer-startup-dialog flag on the command line. On macOS this causes the renderer to print a message with its PID and then call pause() immediately up on startup. This has the effect of pausing execution of the renderer until the process receives a signal (such as attaching the debugger).e.g.
$ ~/dev/chrome//src/xcodebuild/Debug/Chromium.app/Contents/MacOS/Chromium --renderer-startup-dialog
[33215:2055:244180145280185:WARNING:/Users/Shared/bla/chrome/src/chrome/renderer/renderer_main.cc(48)] Renderer (33215) paused waiting for debugger to attach @ pid
So 33215 is the PID of the renderer process in question.2. Open chrome.xcodeproj in Xcode and select Run -> Attach To Process -> Process ID . Debugging out-of-process tests:Similar to debugging the renderer process, simply attaching gdb to a out-of-process test like browser_tests will not hit the test code. In order to debug a browser test, you need to run the test binary with ’--single_process’ (note the underscore in single_process). Because you can only run one browser test in the same process, you’re probably going to need to add --gtest_filter as well. So your command will look like this:/path/to/src/xcodebuild/Debug/browser_tests --single_process --gtest_filter=GoatTeleporterTest.DontTeleportSheepUI DebuggingFor UI Debugging, F-Script Anywhere is very useful. Read https://sites.google.com/a/chromium.org/dev/developers/f-script-anywhere for more information.Building with Ninja, Debugging with XcodeTemporarily disabling the SandboxDisabling the sandbox can sometimes be useful when debugging, this can be achieved by passing the --no-sandbox flag on the command line. This will, for example, allow writing out debugging information to a file from the Renderer Process.e.g.
$ ~/dev/chrome//src/xcodebuild/Debug/Chromium.app/Contents/MacOS/Chromium --no-sandbox
Tips on Debugging the Renderer SandboxLaunch chrome with the --enable-sandbox-logging flag. This will cause a message to be printed to /var/log/system.log every time an operation is denied by the Sandbox (you can use Console.app to watch logfiles). This is really useful for debugging and can often provide an explanation for very puzzling problems.You can also get the Sandbox to send a SIGSTOP to a process when the sandbox denies functionality. This allows you to attach with a debugger and continue the execution from where it left off:$ sandbox-exec -p ’(version 1) (allow default) (deny file-write* (regex ’foo’) (with send-signal SIGSTOP))’ touch fooBreakpoints Not Getting Hit in gdbIf a breakpoint you set isn’t causing the debugger to stop, try one of these solutions:
*Uncheck ’Load symbols lazily’ In the Xcode->Preferences->Debugging dialog.
*Manually insert a call to Debugger() in the code, this will forcefully break into the Debugger.Debugging in Release ModePreserving symbols in Release buildsProfiling tools like Shark and ’sample’ expect to find symbol names in the binary, but in Release builds most symbols are stripped out. You can preserve symbols by temporarily changing the build process, by adding mac_strip_release=0 to your GYP_DEFINES, rerunning gclient runhooks, and rebuilding (changing this define only relinks the main binary, it doesn’t recompile everything).(The above ’Debugging in Release Mode’ trick with the .dSYM file might work for Shark/sample too; I haven’t tried it yet. —snej)Using DTracejgm’s awesome introductory article:
http://www.mactech.com/articles/mactech/Vol.23/23.11/ExploringLeopardwithDTrace/index.html
Defining static probes on macOS:
http://www.macresearch.org/tuning-cocoa-applications-using-dtrace-custom-static-probes-and-instruments
http://www.brendangregg.com/dtrace.html#Examples
http://blogs.sun.com/bmc/resource/dtrace_tips.pdf
DTrace examples on macOS: /usr/share/examples/DTTk
To get truss on macOS, use dtruss. That requires root, so I often sudo dtruss -p and attach to a running nonroot program.
Testing other localesTo test Chrome in a different locale, change your system locale via the System Preferences. (Keep the preferences window open so that you can change the locale back without needing to navigate through menus in a language you may not know.)Memory/Heap InspectionThere are several low-level command-line tools that can be used to inspect what’s going on with memory inside a process.’heap’ summarizes what’s currently in the malloc heap(s) of a process. (It only works with regular malloc, of course, but Mac Chrome still uses that.) It shows a number of useful things:
*How much of the heap is used or free
*The distribution of block sizes
*A listing of every C++, Objective-C and CoreFoundation class found in the heap, with the number of instances, total size and average size.It identifies C++ objects by their vtables, so it can’t identify vtable-less classes, including a lot of the lower-level WebCore ones like StringImpl. To work around this I temporarily added the ’virtual’ keyword to WebCore::RefCounted’s destructor method, which forces every ref-counted object to include a vtable pointer identifying its class.
’malloc_history’ identifies the stack backtrace that allocated every malloc block in the heap. It lists every unique backtrace together with its number of blocks and their total size. It requires that the process use malloc stack logging, which is enabled if the environment variable MallocStackLogging is set when it launches. The ’env’ command is handy for this:
$ env MallocStackLogging=1 Chromium.app/Contents/MacOS/ChromiumThen in another shell you run
$ malloc_history pid -all_by_sizeWatch out: the output is big. I ran malloc_history on a fairly bloated heap and got 60MB of text.
’leaks’ finds malloc blocks that have no pointers to them and are probably leaked. It doesn’t require MallocStackLogging, but it’s more useful if it’s on because it can then show the backtrace that allocated each leaked block. (So far I’ve seen only trivial leakage in Chrome.)
’vmmap’ shows all the virtual-memory regions in the process’s address space. This is less useful since it doesn’t say anything about individual malloc blocks (except huge ones) but it can be useful for looking at things like static data size, mapped files, and how much memory is paged out. I recommend the ’-resident’ flag, which shows how much of each allocation is currently paged into RAM. See the man page for details.
Notes:
*These are not going to be very useful on stripped binaries, and they’re less useful in release builds.
*All of these except vmmap take several minutes to run, apparently because of the number of symbols in Chrome. They spend most of their time pegging one CPU down inside system code that’s reading symbol tables from the binary. Be patient.
*There are GUI apps in /Developer that do a lot of the same things, such as Instruments, MallocDebug and Shark. I (snej) personally find the command-line tools easier to understand, but YMMV.Working with minidumpsCrMallocErrorBreakIf you are looking at a crash report that ends in CrMallocErrorBreak, then either a malloc or free call has failed with the given stacktrace. Chromium overrides the empty function malloc_error_break in macOS’s Libc with CrMallocErrorBreak. The system calls this function as a debugging aide that we’ve made fatal because it catches useful memory errors. Specifically, CrMallocErrorBreak will be called (resulting in a crash) under the following circumstances:
*Attempting to free a pointer that was not allocated.
*Attempting to free the same pointer more than once.
*Freeing a pointer of size 0.
*Freeing an unaligned pointer.
*An internal checksum of the object being freed does not match. This usually indicates heap corruption!
*Invalid checksums on the small or tiny free list. The system maintains a list of small allocations that it reuses to speed up things like allocations in a loop. A checksum mismatch usually indicates a use-after-free, double-free, or heap corruption.
*Extra-large allocation failures. Normally all failures to allocate go through CrMallocErrorBreak but are not fatal because that is the job of Chromium’s OOM killer. Extra-large allocations go through a different path and are sometimes killed here instead.If you get a crash report that that ends in CrMallocErrorBreak, it is likely not an issue with this feature. It is instead surfacing a (sometimes serious) bug in your code or other code that is stomping on your code’s memory. Using Chromium’s memory tools (ASan, HeapCheck, and Valgrind) is a good start, if you can reproduce the problem.Enabling high-DPI (aka ’HiDPI’ or ’Retina’) modes on standard-DPI hardware.Under macOS 10.7 and above it’s possible to fake ’HiDPI’ modes on standard-DPI hardware. This can be useful in testing up-scaling codepaths or high-DPI resources.
*Configure the OS to offer HiDPI modes:
*EITHER follow Apple’s instructions to enable high resolution modes:http://developer.apple.com/library/mac/#documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Testing/Testing.html.
*OR run the command-line: sudo defaults write /Library/Preferences/com.apple.windowserver DisplayResolutionEnabled -bool YES
*Open the System Preferences -> Displays panel, select Scaled mode and scroll to the bottom to see modes marked ’(HiDPI)’.Looking for gdb? It’s been replaced with lldb. Use that it instead.Taking CPU SamplesA quick and easy way to investigate slow or hung processes is to use the sample facility, which will generate a CPU sample trace. This can be done either in the Terminal with the sample(1) command or by using Activity Monitor:
*Open Activity Monitor
*Find the process you want to sample (for ’Helper’ processes, you may want to consult the Chrome Task Manager)
*Double-click on the row
*Click the Sample button in the process’s information windowAfter a few seconds, the sample will be completed. For official Google Chrome builds, the sample should be symbolized using crsym. If you do not have access to crsym, save the entire contents as a file and attach it to a bug report for later
https://diarynote-jp.indered.space
コメント