@@ -143,9 +143,9 @@ read_char(proc_handle_t *handle, uintptr_t address, char *result)
143
143
}
144
144
145
145
static int
146
- read_int (proc_handle_t * handle , uintptr_t address , int * result )
146
+ read_sized_int (proc_handle_t * handle , uintptr_t address , void * result , size_t size )
147
147
{
148
- int res = _Py_RemoteDebug_ReadRemoteMemory (handle , address , sizeof ( int ) , result );
148
+ int res = _Py_RemoteDebug_ReadRemoteMemory (handle , address , size , result );
149
149
if (res < 0 ) {
150
150
return -1 ;
151
151
}
@@ -367,11 +367,13 @@ parse_coro_chain(
367
367
}
368
368
Py_DECREF (name );
369
369
370
- int gi_frame_state ;
371
- err = read_int (
370
+ int8_t gi_frame_state ;
371
+ err = read_sized_int (
372
372
handle ,
373
373
coro_address + offsets -> gen_object .gi_frame_state ,
374
- & gi_frame_state );
374
+ & gi_frame_state ,
375
+ sizeof (int8_t )
376
+ );
375
377
if (err ) {
376
378
return -1 ;
377
379
}
@@ -461,7 +463,8 @@ parse_task_awaited_by(
461
463
struct _Py_DebugOffsets * offsets ,
462
464
struct _Py_AsyncioModuleDebugOffsets * async_offsets ,
463
465
uintptr_t task_address ,
464
- PyObject * awaited_by
466
+ PyObject * awaited_by ,
467
+ int recurse_task
465
468
);
466
469
467
470
@@ -471,7 +474,8 @@ parse_task(
471
474
struct _Py_DebugOffsets * offsets ,
472
475
struct _Py_AsyncioModuleDebugOffsets * async_offsets ,
473
476
uintptr_t task_address ,
474
- PyObject * render_to
477
+ PyObject * render_to ,
478
+ int recurse_task
475
479
) {
476
480
char is_task ;
477
481
int err = read_char (
@@ -502,8 +506,13 @@ parse_task(
502
506
Py_DECREF (call_stack );
503
507
504
508
if (is_task ) {
505
- PyObject * tn = parse_task_name (
506
- handle , offsets , async_offsets , task_address );
509
+ PyObject * tn = NULL ;
510
+ if (recurse_task ) {
511
+ tn = parse_task_name (
512
+ handle , offsets , async_offsets , task_address );
513
+ } else {
514
+ tn = PyLong_FromUnsignedLong (task_address );
515
+ }
507
516
if (tn == NULL ) {
508
517
goto err ;
509
518
}
@@ -544,21 +553,23 @@ parse_task(
544
553
goto err ;
545
554
}
546
555
547
- PyObject * awaited_by = PyList_New (0 );
548
- if (awaited_by == NULL ) {
549
- goto err ;
550
- }
551
- if (PyList_Append (result , awaited_by )) {
556
+ if (recurse_task ) {
557
+ PyObject * awaited_by = PyList_New (0 );
558
+ if (awaited_by == NULL ) {
559
+ goto err ;
560
+ }
561
+ if (PyList_Append (result , awaited_by )) {
562
+ Py_DECREF (awaited_by );
563
+ goto err ;
564
+ }
565
+ /* we can operate on a borrowed one to simplify cleanup */
552
566
Py_DECREF (awaited_by );
553
- goto err ;
554
- }
555
- /* we can operate on a borrowed one to simplify cleanup */
556
- Py_DECREF (awaited_by );
557
567
558
- if (parse_task_awaited_by (handle , offsets , async_offsets ,
559
- task_address , awaited_by )
560
- ) {
561
- goto err ;
568
+ if (parse_task_awaited_by (handle , offsets , async_offsets ,
569
+ task_address , awaited_by , 1 )
570
+ ) {
571
+ goto err ;
572
+ }
562
573
}
563
574
Py_DECREF (result );
564
575
@@ -575,7 +586,8 @@ parse_tasks_in_set(
575
586
struct _Py_DebugOffsets * offsets ,
576
587
struct _Py_AsyncioModuleDebugOffsets * async_offsets ,
577
588
uintptr_t set_addr ,
578
- PyObject * awaited_by
589
+ PyObject * awaited_by ,
590
+ int recurse_task
579
591
) {
580
592
uintptr_t set_obj ;
581
593
if (read_py_ptr (
@@ -636,7 +648,9 @@ parse_tasks_in_set(
636
648
offsets ,
637
649
async_offsets ,
638
650
key_addr ,
639
- awaited_by )
651
+ awaited_by ,
652
+ recurse_task
653
+ )
640
654
) {
641
655
return -1 ;
642
656
}
@@ -660,7 +674,8 @@ parse_task_awaited_by(
660
674
struct _Py_DebugOffsets * offsets ,
661
675
struct _Py_AsyncioModuleDebugOffsets * async_offsets ,
662
676
uintptr_t task_address ,
663
- PyObject * awaited_by
677
+ PyObject * awaited_by ,
678
+ int recurse_task
664
679
) {
665
680
uintptr_t task_ab_addr ;
666
681
int err = read_py_ptr (
@@ -690,7 +705,9 @@ parse_task_awaited_by(
690
705
offsets ,
691
706
async_offsets ,
692
707
task_address + async_offsets -> asyncio_task_object .task_awaited_by ,
693
- awaited_by )
708
+ awaited_by ,
709
+ recurse_task
710
+ )
694
711
) {
695
712
return -1 ;
696
713
}
@@ -709,7 +726,9 @@ parse_task_awaited_by(
709
726
offsets ,
710
727
async_offsets ,
711
728
sub_task ,
712
- awaited_by )
729
+ awaited_by ,
730
+ recurse_task
731
+ )
713
732
) {
714
733
return -1 ;
715
734
}
@@ -1054,23 +1073,32 @@ append_awaited_by_for_thread(
1054
1073
return -1 ;
1055
1074
}
1056
1075
1057
- PyObject * result_item = PyTuple_New (2 );
1076
+ PyObject * task_id = PyLong_FromUnsignedLong (task_addr );
1077
+ if (task_id == NULL ) {
1078
+ Py_DECREF (tn );
1079
+ Py_DECREF (current_awaited_by );
1080
+ return -1 ;
1081
+ }
1082
+
1083
+ PyObject * result_item = PyTuple_New (3 );
1058
1084
if (result_item == NULL ) {
1059
1085
Py_DECREF (tn );
1060
1086
Py_DECREF (current_awaited_by );
1087
+ Py_DECREF (task_id );
1061
1088
return -1 ;
1062
1089
}
1063
1090
1064
- PyTuple_SET_ITEM (result_item , 0 , tn ); // steals ref
1065
- PyTuple_SET_ITEM (result_item , 1 , current_awaited_by ); // steals ref
1091
+ PyTuple_SET_ITEM (result_item , 0 , task_id ); // steals ref
1092
+ PyTuple_SET_ITEM (result_item , 1 , tn ); // steals ref
1093
+ PyTuple_SET_ITEM (result_item , 2 , current_awaited_by ); // steals ref
1066
1094
if (PyList_Append (result , result_item )) {
1067
1095
Py_DECREF (result_item );
1068
1096
return -1 ;
1069
1097
}
1070
1098
Py_DECREF (result_item );
1071
1099
1072
1100
if (parse_task_awaited_by (handle , debug_offsets , async_offsets ,
1073
- task_addr , current_awaited_by ))
1101
+ task_addr , current_awaited_by , 0 ))
1074
1102
{
1075
1103
return -1 ;
1076
1104
}
@@ -1491,7 +1519,7 @@ get_async_stack_trace(PyObject* self, PyObject* args)
1491
1519
1492
1520
if (parse_task_awaited_by (
1493
1521
handle , & local_debug_offsets , & local_async_debug ,
1494
- running_task_addr , awaited_by )
1522
+ running_task_addr , awaited_by , 1 )
1495
1523
) {
1496
1524
goto result_err ;
1497
1525
}
@@ -1518,13 +1546,13 @@ static PyMethodDef methods[] = {
1518
1546
1519
1547
static struct PyModuleDef module = {
1520
1548
.m_base = PyModuleDef_HEAD_INIT ,
1521
- .m_name = "_testexternalinspection " ,
1549
+ .m_name = "_remotedebuggingmodule " ,
1522
1550
.m_size = -1 ,
1523
1551
.m_methods = methods ,
1524
1552
};
1525
1553
1526
1554
PyMODINIT_FUNC
1527
- PyInit__testexternalinspection (void )
1555
+ PyInit__remotedebugging (void )
1528
1556
{
1529
1557
PyObject * mod = PyModule_Create (& module );
1530
1558
if (mod == NULL ) {
0 commit comments