Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Viewing a dynamically-allocated array with the Xcode debugger?

Tags:

c++

xcode

macos

gdb

Let's say I have an array in C++:

double* velocity = new double[100]; 

Using the GDB command line, I can view this array with the command:

> print *velocity @ 100 

and it will print a nicely-formatted list of all the double values inside the array.

However, when using the Xcode debugger, the most it will do is treat this as a pointer to a single double value, and display velocity[0] in the variable list.

This makes it a real PITA to debug programs that contain large dynamically allocated array. There has got to be some way to tell Xcode "This is a pointer to an array of length 100", and have it display the thing as such. Anyone know what it is?

like image 527
avalys Avatar asked Jan 27 '09 18:01

avalys


People also ask

How to view array in Xcode debugger?

As of Xcode 10, you can right-click velocity , choose "View value as..." and then "Custom Type". Then cast it to (double(&)[100]) *velocity and display the array in the GUI. This works!

How do I run debugger in Xcode?

Step Through Code in the Debugger Customize what Xcode displays when running your app in the debugger by choosing Xcode > Preferences > Behaviors > Running. Use the buttons in the debug bar to control the execution of your app.


2 Answers

I think that my answer will be a good addition for the old one.

New versions of Xcode use lldb debugger as default tool instead of gdb.

According this page:

With the release of Xcode 5, the LLDB debugger becomes the foundation for the debugging experience on OS X.

So for Xcode since version 5 and up I use this lldb command:

 memory read -t int -c8 `array_name` 

where:
8 - the number of elements in array
array_name - the name of array
int - the type of array

The result of execution of this command will be something like this:

 (lldb) memory read -t int -c8 array (int) 0x7fff5fbff870 = 7 (int) 0x7fff5fbff874 = 6 (int) 0x7fff5fbff878 = 9 (int) 0x7fff5fbff87c = 10 (int) 0x7fff5fbff880 = 1 (int) 0x7fff5fbff884 = 8 (int) 0x7fff5fbff888 = 4 (int) 0x7fff5fbff88c = 3 
like image 56
Alexander Myshov Avatar answered Oct 14 '22 14:10

Alexander Myshov


You can use gdb syntax as expressions:

  1. Use Run/Show/Expressions... menu to show the expressions window
  2. Enter '*velocity @ 100' at the bottom of the window (Expression:)
like image 45
mfazekas Avatar answered Oct 14 '22 16:10

mfazekas