@@ -724,7 +724,7 @@ find_running_task_in_thread(
724724}
725725
726726int
727- get_task_code_object (RemoteUnwinderObject * unwinder , uintptr_t task_addr , uintptr_t * code_obj_addr ) {
727+ get_task_frame (RemoteUnwinderObject * unwinder , uintptr_t task_addr , uintptr_t * frame_addr ) {
728728 uintptr_t running_coro_addr = 0 ;
729729
730730 if (read_py_ptr (
@@ -741,21 +741,7 @@ get_task_code_object(RemoteUnwinderObject *unwinder, uintptr_t task_addr, uintpt
741741 return -1 ;
742742 }
743743
744- // note: genobject's gi_iframe is an embedded struct so the address to
745- // the offset leads directly to its first field: f_executable
746- if (read_py_ptr (
747- unwinder ,
748- running_coro_addr + (uintptr_t )unwinder -> debug_offsets .gen_object .gi_iframe , code_obj_addr ) < 0 ) {
749- set_exception_cause (unwinder , PyExc_RuntimeError , "Failed to read running task code object" );
750- return -1 ;
751- }
752-
753- if (* code_obj_addr == 0 ) {
754- PyErr_SetString (PyExc_RuntimeError , "Running task code object is NULL" );
755- set_exception_cause (unwinder , PyExc_RuntimeError , "Running task code object address is NULL" );
756- return -1 ;
757- }
758-
744+ * frame_addr = running_coro_addr + (uintptr_t )unwinder -> debug_offsets .gen_object .gi_iframe ;
759745 return 0 ;
760746}
761747
@@ -768,7 +754,7 @@ parse_async_frame_chain(
768754 RemoteUnwinderObject * unwinder ,
769755 PyObject * calls ,
770756 uintptr_t address_of_thread ,
771- uintptr_t running_task_code_obj
757+ uintptr_t running_task_frame
772758) {
773759 uintptr_t address_of_current_frame ;
774760 if (find_running_frame (unwinder , address_of_thread , & address_of_current_frame ) < 0 ) {
@@ -779,6 +765,8 @@ parse_async_frame_chain(
779765 while ((void * )address_of_current_frame != NULL ) {
780766 PyObject * frame_info = NULL ;
781767 uintptr_t address_of_code_object ;
768+
769+ uintptr_t this_frame = address_of_current_frame ;
782770 int res = parse_frame_object (
783771 unwinder ,
784772 & frame_info ,
@@ -803,8 +791,9 @@ parse_async_frame_chain(
803791 }
804792
805793 Py_DECREF (frame_info );
806-
807- if (address_of_code_object == running_task_code_obj ) {
794+
795+ // gh-158522: compare frame instead of code-object
796+ if (this_frame == running_task_frame ) {
808797 break ;
809798 }
810799 }
@@ -940,8 +929,8 @@ process_running_task_chain(
940929 uintptr_t thread_state_addr ,
941930 PyObject * result
942931) {
943- uintptr_t running_task_code_obj = 0 ;
944- if (get_task_code_object (unwinder , running_task_addr , & running_task_code_obj ) < 0 ) {
932+ uintptr_t running_task_frame = 0 ;
933+ if (get_task_frame (unwinder , running_task_addr , & running_task_frame ) < 0 ) {
945934 return -1 ;
946935 }
947936
@@ -973,7 +962,7 @@ process_running_task_chain(
973962 }
974963
975964 // Add the chain from the current frame to this task
976- if (parse_async_frame_chain (unwinder , frame_chain , thread_state_addr , running_task_code_obj ) < 0 ) {
965+ if (parse_async_frame_chain (unwinder , frame_chain , thread_state_addr , running_task_frame ) < 0 ) {
977966 return -1 ;
978967 }
979968
0 commit comments