@@ -4724,17 +4724,19 @@ mono_ss_create_init_args (SingleStepReq *ss_req, SingleStepArgs *args)
4724
4724
frame = tls -> frames [0 ];
4725
4725
}
4726
4726
4727
- if (ss_req -> size == STEP_SIZE_LINE ) {
4727
+ if (ss_req -> size == STEP_SIZE_LINE_COLUMN ) {
4728
4728
if (frame ) {
4729
4729
ss_req -> last_method = frame -> de .method ;
4730
4730
ss_req -> last_line = -1 ;
4731
+ ss_req -> last_column = -1 ;
4731
4732
4732
4733
minfo = mono_debug_lookup_method (frame -> de .method );
4733
4734
if (minfo && frame -> il_offset != -1 ) {
4734
4735
MonoDebugSourceLocation * loc = mono_debug_method_lookup_location (minfo , frame -> il_offset );
4735
4736
4736
4737
if (loc ) {
4737
4738
ss_req -> last_line = loc -> row ;
4739
+ ss_req -> last_column = loc -> column ;
4738
4740
g_free (loc );
4739
4741
}
4740
4742
}
@@ -6907,6 +6909,44 @@ static void add_error_string (Buffer *buf, const char *str)
6907
6909
buffer_add_string (buf , str );
6908
6910
}
6909
6911
6912
+ static void
6913
+ create_file_to_check_memory_address (void )
6914
+ {
6915
+ if (file_check_valid_memory != -1 )
6916
+ return ;
6917
+ char * file_name = g_strdup_printf ("debugger_check_valid_memory.%d" , mono_process_current_pid ());
6918
+ filename_check_valid_memory = g_build_filename (g_get_tmp_dir (), file_name , (const char * )NULL );
6919
+ file_check_valid_memory = open (filename_check_valid_memory , O_CREAT | O_WRONLY | O_APPEND , S_IWUSR );
6920
+ g_free (file_name );
6921
+ }
6922
+
6923
+ static gboolean
6924
+ valid_memory_address (gpointer addr , gint size )
6925
+ {
6926
+ #ifndef _MSC_VER
6927
+ gboolean ret = TRUE;
6928
+ create_file_to_check_memory_address ();
6929
+ if (file_check_valid_memory < 0 ) {
6930
+ return TRUE;
6931
+ }
6932
+ write (file_check_valid_memory , (gpointer )addr , 1 );
6933
+ if (errno == EFAULT ) {
6934
+ ret = FALSE;
6935
+ }
6936
+ #else
6937
+ int i = 0 ;
6938
+ gboolean ret = FALSE;
6939
+ __try {
6940
+ for (i = 0 ; i < size ; i ++ )
6941
+ * ((volatile char * )addr + i );
6942
+ ret = TRUE;
6943
+ } __except(1 ) {
6944
+ return ret ;
6945
+ }
6946
+ #endif
6947
+ return ret ;
6948
+ }
6949
+
6910
6950
static ErrorCode
6911
6951
vm_commands (int command , int id , guint8 * p , guint8 * end , Buffer * buf )
6912
6952
{
@@ -7252,6 +7292,8 @@ vm_commands (int command, int id, guint8 *p, guint8 *end, Buffer *buf)
7252
7292
case MDBGPROT_CMD_VM_READ_MEMORY : {
7253
7293
guint8 * memory = (guint8 * )GINT_TO_POINTER (decode_long (p , & p , end ));
7254
7294
int size = decode_int (p , & p , end );
7295
+ if (!valid_memory_address (memory , size ))
7296
+ return ERR_INVALID_ARGUMENT ;
7255
7297
PRINT_DEBUG_MSG (1 , "MDBGPROT_CMD_VM_READ_MEMORY - [%p] - size - %d\n" , memory , size );
7256
7298
buffer_add_byte_array (buf , memory , size );
7257
7299
break ;
@@ -9840,6 +9882,7 @@ frame_commands (int command, guint8 *p, guint8 *end, Buffer *buf)
9840
9882
return cmd_stack_frame_get_this (frame , sig , buf , jit );
9841
9883
break ;
9842
9884
}
9885
+ case MDBGPROT_CMD_STACK_FRAME_SET_VALUES_2 :
9843
9886
case CMD_STACK_FRAME_SET_VALUES : {
9844
9887
guint8 * val_buf ;
9845
9888
MonoType * t ;
@@ -9852,8 +9895,9 @@ frame_commands (int command, guint8 *p, guint8 *end, Buffer *buf)
9852
9895
9853
9896
for (i = 0 ; i < len ; ++ i ) {
9854
9897
pos = decode_int (p , & p , end );
9855
-
9856
9898
if (pos < 0 ) {
9899
+ if (command == MDBGPROT_CMD_STACK_FRAME_SET_VALUES_2 && sig -> hasthis ) //0 == this
9900
+ pos ++ ;
9857
9901
pos = - pos - 1 ;
9858
9902
9859
9903
g_assert (pos >= 0 && GINT_TO_UINT32 (pos ) < jit -> num_params );
@@ -9943,6 +9987,19 @@ frame_commands (int command, guint8 *p, guint8 *end, Buffer *buf)
9943
9987
buffer_add_long (buf , (gssize )frame -> frame_addr );
9944
9988
break ;
9945
9989
}
9990
+ case MDBGPROT_CMD_STACK_FRAME_GET_COUNT : {
9991
+ MonoDebugLocalsInfo * locals ;
9992
+ locals = mono_debug_lookup_locals (frame -> de .method );
9993
+ if (locals )
9994
+ buffer_add_int (buf , locals -> num_locals );
9995
+ else
9996
+ buffer_add_int (buf , 0 );
9997
+ break ;
9998
+ }
9999
+ case MDBGPROT_CMD_STACK_FRAME_GET_PARAMETERS_COUNT : {
10000
+ buffer_add_int (buf , jit -> num_params + (sig -> hasthis ? 1 : 0 ));
10001
+ break ;
10002
+ }
9946
10003
default :
9947
10004
return ERR_NOT_IMPLEMENTED ;
9948
10005
}
@@ -10085,44 +10142,6 @@ string_commands (int command, guint8 *p, guint8 *end, Buffer *buf)
10085
10142
return ERR_NONE ;
10086
10143
}
10087
10144
10088
- static void
10089
- create_file_to_check_memory_address (void )
10090
- {
10091
- if (file_check_valid_memory != -1 )
10092
- return ;
10093
- char * file_name = g_strdup_printf ("debugger_check_valid_memory.%d" , mono_process_current_pid ());
10094
- filename_check_valid_memory = g_build_filename (g_get_tmp_dir (), file_name , (const char * )NULL );
10095
- file_check_valid_memory = open (filename_check_valid_memory , O_CREAT | O_WRONLY | O_APPEND , S_IWUSR );
10096
- g_free (file_name );
10097
- }
10098
-
10099
- static gboolean
10100
- valid_memory_address (gpointer addr , gint size )
10101
- {
10102
- #ifndef _MSC_VER
10103
- gboolean ret = TRUE;
10104
- create_file_to_check_memory_address ();
10105
- if (file_check_valid_memory < 0 ) {
10106
- return TRUE;
10107
- }
10108
- write (file_check_valid_memory , (gpointer )addr , 1 );
10109
- if (errno == EFAULT ) {
10110
- ret = FALSE;
10111
- }
10112
- #else
10113
- int i = 0 ;
10114
- gboolean ret = FALSE;
10115
- __try {
10116
- for (i = 0 ; i < size ; i ++ )
10117
- * ((volatile char * )addr + i );
10118
- ret = TRUE;
10119
- } __except(1 ) {
10120
- return ret ;
10121
- }
10122
- #endif
10123
- return ret ;
10124
- }
10125
-
10126
10145
static ErrorCode
10127
10146
pointer_commands (int command , guint8 * p , guint8 * end , Buffer * buf )
10128
10147
{
@@ -10273,11 +10292,12 @@ object_commands (int command, guint8 *p, guint8 *end, Buffer *buf)
10273
10292
len = decode_int (p , & p , end );
10274
10293
i = 0 ;
10275
10294
int field_token = decode_int (p , & p , end );
10276
- gpointer iter = NULL ;
10277
-
10278
- while ((f = mono_class_get_fields_internal (obj_type , & iter ))) {
10279
- if (mono_class_get_field_token (f ) == field_token )
10280
- goto set_field_value ;
10295
+ for (k = obj_type ; k ; k = m_class_get_parent (k )) {
10296
+ gpointer iter = NULL ;
10297
+ while ((f = mono_class_get_fields_internal (k , & iter ))) {
10298
+ if (mono_class_get_field_token (f ) == field_token )
10299
+ goto set_field_value ;
10300
+ }
10281
10301
}
10282
10302
goto invalid_fieldid ;
10283
10303
case CMD_OBJECT_REF_SET_VALUES :
0 commit comments