brintos

brintos / llvm-project-archived public Read only

0
0
Text · 27.9 KiB · 8355865 Raw
688 lines · python
1import ompdModule2import gdb3import re4import traceback5from ompd_address_space import ompd_address_space6from ompd_handles import ompd_thread, ompd_task, ompd_parallel7from frame_filter import FrameFilter8from enum import Enum9 10 11addr_space = None12ff = None13icv_map = None14ompd_scope_map = {15    1: "global",16    2: "address_space",17    3: "thread",18    4: "parallel",19    5: "implicit_task",20    6: "task",21}22in_task_function = False23 24 25class ompd(gdb.Command):26    def __init__(self):27        super(ompd, self).__init__("ompd", gdb.COMMAND_STATUS, gdb.COMPLETE_NONE, True)28 29 30class ompd_init(gdb.Command):31    """Find and initialize ompd library"""32 33    # first parameter is command-line input, second parameter is gdb-specific data34    def __init__(self):35        self.__doc__ = "Find and initialize OMPD library\n usage: ompd init"36        super(ompd_init, self).__init__("ompd init", gdb.COMMAND_DATA)37 38    def invoke(self, arg, from_tty):39        global addr_space40        global ff41        try:42            try:43                print(gdb.newest_frame())44            except:45                gdb.execute("start")46            try:47                lib_list = gdb.parse_and_eval("(char**)ompd_dll_locations")48            except gdb.error:49                raise ValueError(50                    "No ompd_dll_locations symbol in execution, make sure to have an OMPD enabled OpenMP runtime"51                )52 53            while not gdb.parse_and_eval("(char**)ompd_dll_locations"):54                gdb.execute("tbreak ompd_dll_locations_valid")55                gdb.execute("continue")56 57            lib_list = gdb.parse_and_eval("(char**)ompd_dll_locations")58 59            i = 060            while lib_list[i]:61                ret = ompdModule.ompd_open(lib_list[i].string())62                if ret == -1:63                    raise ValueError("Handle of OMPD library is not a valid string!")64                if ret == -2:65                    print("ret == -2")66                    pass  # It's ok to fail on dlopen67                if ret == -3:68                    print("ret == -3")69                    pass  # It's ok to fail on dlsym70                if ret < -10:71                    raise ValueError("OMPD error code %i!" % (-10 - ret))72 73                if ret > 0:74                    print("Loaded OMPD lib successfully!")75                    try:76                        addr_space = ompd_address_space()77                        ff = FrameFilter(addr_space)78                    except:79                        traceback.print_exc()80                    return81                i = i + 182 83            raise ValueError("OMPD library could not be loaded!")84        except:85            traceback.print_exc()86 87 88class ompd_threads(gdb.Command):89    """Register thread ids of current context"""90 91    def __init__(self):92        self.__doc__ = (93            "Provide information on threads of current context.\n usage: ompd threads"94        )95        super(ompd_threads, self).__init__("ompd threads", gdb.COMMAND_STATUS)96 97    def invoke(self, arg, from_tty):98        global addr_space99        if init_error():100            return101        addr_space.list_threads(True)102 103 104def print_parallel_region(curr_parallel, team_size):105    """Helper function for ompd_parallel_region. To print out the details of the parallel region."""106    for omp_thr in range(team_size):107        thread = curr_parallel.get_thread_in_parallel(omp_thr)108        ompd_state = str(addr_space.states[thread.get_state()[0]])109        ompd_wait_id = thread.get_state()[1]110        task = curr_parallel.get_task_in_parallel(omp_thr)111        task_func_addr = task.get_task_function()112        # Get the function this addr belongs to113        sal = gdb.find_pc_line(task_func_addr)114        block = gdb.block_for_pc(task_func_addr)115        while block and not block.function:116            block = block.superblock117        if omp_thr == 0:118            print(119                "%6d (master) %-37s %ld    0x%lx %-25s %-17s:%d"120                % (121                    omp_thr,122                    ompd_state,123                    ompd_wait_id,124                    task_func_addr,125                    block.function.print_name,126                    sal.symtab.filename,127                    sal.line,128                )129            )130        else:131            print(132                "%6d          %-37s %ld    0x%lx %-25s %-17s:%d"133                % (134                    omp_thr,135                    ompd_state,136                    ompd_wait_id,137                    task_func_addr,138                    block.function.print_name,139                    sal.symtab.filename,140                    sal.line,141                )142            )143 144 145class ompd_parallel_region(gdb.Command):146    """Parallel Region Details"""147 148    def __init__(self):149        self.__doc__ = "Display the details of the current and enclosing parallel regions.\n usage: ompd parallel"150        super(ompd_parallel_region, self).__init__("ompd parallel", gdb.COMMAND_STATUS)151 152    def invoke(self, arg, from_tty):153        global addr_space154        if init_error():155            return156        if addr_space.icv_map is None:157            addr_space.get_icv_map()158        if addr_space.states is None:159            addr_space.enumerate_states()160        curr_thread_handle = addr_space.get_curr_thread()161        curr_parallel_handle = curr_thread_handle.get_current_parallel_handle()162        curr_parallel = ompd_parallel(curr_parallel_handle)163        while curr_parallel_handle is not None and curr_parallel is not None:164            nest_level = ompdModule.call_ompd_get_icv_from_scope(165                curr_parallel_handle,166                addr_space.icv_map["levels-var"][1],167                addr_space.icv_map["levels-var"][0],168            )169            if nest_level == 0:170                break171            team_size = ompdModule.call_ompd_get_icv_from_scope(172                curr_parallel_handle,173                addr_space.icv_map["team-size-var"][1],174                addr_space.icv_map["team-size-var"][0],175            )176            print("")177            print(178                "Parallel Region: Nesting Level %d: Team Size: %d"179                % (nest_level, team_size)180            )181            print("================================================")182            print("")183            print(184                "OMP Thread Nbr  Thread State                     Wait Id  EntryAddr FuncName                 File:Line"185            )186            print(187                "======================================================================================================"188            )189            print_parallel_region(curr_parallel, team_size)190            enclosing_parallel = curr_parallel.get_enclosing_parallel()191            enclosing_parallel_handle = curr_parallel.get_enclosing_parallel_handle()192            curr_parallel = enclosing_parallel193            curr_parallel_handle = enclosing_parallel_handle194 195 196class ompd_icvs(gdb.Command):197    """ICVs"""198 199    def __init__(self):200        self.__doc__ = (201            "Display the values of the Internal Control Variables.\n usage: ompd icvs"202        )203        super(ompd_icvs, self).__init__("ompd icvs", gdb.COMMAND_STATUS)204 205    def invoke(self, arg, from_tty):206        global addr_space207        global ompd_scope_map208        if init_error():209            return210        curr_thread_handle = addr_space.get_curr_thread()211        if addr_space.icv_map is None:212            addr_space.get_icv_map()213        print("ICV Name                        Scope                     Value")214        print("===============================================================")215 216        try:217            for icv_name in addr_space.icv_map:218                scope = addr_space.icv_map[icv_name][1]219                # {1:'global', 2:'address_space', 3:'thread', 4:'parallel', 5:'implicit_task', 6:'task'}220                if scope == 2:221                    handle = addr_space.addr_space222                elif scope == 3:223                    handle = curr_thread_handle.thread_handle224                elif scope == 4:225                    handle = curr_thread_handle.get_current_parallel_handle()226                elif scope == 6:227                    handle = curr_thread_handle.get_current_task_handle()228                else:229                    raise ValueError("Invalid scope")230 231                if icv_name == "nthreads-var" or icv_name == "bind-var":232                    icv_value = ompdModule.call_ompd_get_icv_from_scope(233                        handle, scope, addr_space.icv_map[icv_name][0]234                    )235                    if icv_value is None:236                        icv_string = ompdModule.call_ompd_get_icv_string_from_scope(237                            handle, scope, addr_space.icv_map[icv_name][0]238                        )239                        print(240                            "%-31s %-26s %s"241                            % (icv_name, ompd_scope_map[scope], icv_string)242                        )243                    else:244                        print(245                            "%-31s %-26s %d"246                            % (icv_name, ompd_scope_map[scope], icv_value)247                        )248 249                elif (250                    icv_name == "affinity-format-var"251                    or icv_name == "run-sched-var"252                    or icv_name == "tool-libraries-var"253                    or icv_name == "tool-verbose-init-var"254                ):255                    icv_string = ompdModule.call_ompd_get_icv_string_from_scope(256                        handle, scope, addr_space.icv_map[icv_name][0]257                    )258                    print(259                        "%-31s %-26s %s" % (icv_name, ompd_scope_map[scope], icv_string)260                    )261                else:262                    icv_value = ompdModule.call_ompd_get_icv_from_scope(263                        handle, scope, addr_space.icv_map[icv_name][0]264                    )265                    print(266                        "%-31s %-26s %d" % (icv_name, ompd_scope_map[scope], icv_value)267                    )268        except:269            traceback.print_exc()270 271 272def curr_thread():273    """Helper function for ompd_step. Returns the thread object for the current thread number."""274    global addr_space275    if addr_space is not None:276        return addr_space.threads[int(gdb.selected_thread().num)]277    return None278 279 280class ompd_test(gdb.Command):281    """Test area"""282 283    def __init__(self):284        self.__doc__ = "Test functionalities for correctness\n usage: ompd test"285        super(ompd_test, self).__init__("ompd test", gdb.COMMAND_OBSCURE)286 287    def invoke(self, arg, from_tty):288        global addr_space289        if init_error():290            return291        # get task function for current task of current thread292        try:293            current_thread = int(gdb.selected_thread().num)294            current_thread_obj = addr_space.threads[current_thread]295            task_function = current_thread_obj.get_current_task().get_task_function()296            print("bt value:", int("0x0000000000400b6c", 0))297            print("get_task_function value:", task_function)298 299            # get task function of implicit task in current parallel region for current thread300            current_parallel_obj = current_thread_obj.get_current_parallel()301            task_in_parallel = current_parallel_obj.get_task_in_parallel(current_thread)302            task_function_in_parallel = task_in_parallel.get_task_function()303            print("task_function_in_parallel:", task_function_in_parallel)304        except:305            print("Task function value not found for this thread")306 307 308class ompdtestapi(gdb.Command):309    """To test API's return code"""310 311    def __init__(self):312        self.__doc__ = "Test OMPD tool Interface APIs.\nUsage: ompdtestapi <api name>"313        super(ompdtestapi, self).__init__("ompdtestapi", gdb.COMMAND_OBSCURE)314 315    def invoke(self, arg, from_tty):316        global addr_space317        if init_error():318            print("Error in Initialization.")319            return320        if not arg:321            print("No API provided to test, eg: ompdtestapi ompd_initialize")322 323        if arg == "ompd_get_thread_handle":324            addr_handle = addr_space.addr_space325            threadId = gdb.selected_thread().ptid[1]326            ompdModule.test_ompd_get_thread_handle(addr_handle, threadId)327        elif arg == "ompd_get_curr_parallel_handle":328            addr_handle = addr_space.addr_space329            threadId = gdb.selected_thread().ptid[1]330            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)331            ompdModule.test_ompd_get_curr_parallel_handle(thread_handle)332        elif arg == "ompd_get_thread_in_parallel":333            addr_handle = addr_space.addr_space334            threadId = gdb.selected_thread().ptid[1]335            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)336            parallel_handle = ompdModule.call_ompd_get_curr_parallel_handle(337                thread_handle338            )339            ompdModule.test_ompd_get_thread_in_parallel(parallel_handle)340        elif arg == "ompd_thread_handle_compare":341            addr_handle = addr_space.addr_space342            threadId = gdb.selected_thread().ptid[1]343            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)344            parallel_handle = ompdModule.call_ompd_get_curr_parallel_handle(345                thread_handle346            )347            thread_handle1 = ompdModule.call_ompd_get_thread_in_parallel(348                parallel_handle, 1349            )350            thread_handle2 = ompdModule.call_ompd_get_thread_in_parallel(351                parallel_handle, 2352            )353            ompdModule.test_ompd_thread_handle_compare(thread_handle1, thread_handle1)354            ompdModule.test_ompd_thread_handle_compare(thread_handle1, thread_handle2)355        elif arg == "ompd_get_thread_id":356            addr_handle = addr_space.addr_space357            threadId = gdb.selected_thread().ptid[1]358            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)359            ompdModule.test_ompd_get_thread_id(thread_handle)360        elif arg == "ompd_rel_thread_handle":361            addr_handle = addr_space.addr_space362            threadId = gdb.selected_thread().ptid[1]363            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)364            ompdModule.test_ompd_rel_thread_handle(thread_handle)365        elif arg == "ompd_get_enclosing_parallel_handle":366            addr_handle = addr_space.addr_space367            threadId = gdb.selected_thread().ptid[1]368            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)369            parallel_handle = ompdModule.call_ompd_get_curr_parallel_handle(370                thread_handle371            )372            ompdModule.test_ompd_get_enclosing_parallel_handle(parallel_handle)373        elif arg == "ompd_parallel_handle_compare":374            addr_handle = addr_space.addr_space375            threadId = gdb.selected_thread().ptid[1]376            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)377            parallel_handle1 = ompdModule.call_ompd_get_curr_parallel_handle(378                thread_handle379            )380            parallel_handle2 = ompdModule.call_ompd_get_enclosing_parallel_handle(381                parallel_handle1382            )383            ompdModule.test_ompd_parallel_handle_compare(384                parallel_handle1, parallel_handle1385            )386            ompdModule.test_ompd_parallel_handle_compare(387                parallel_handle1, parallel_handle2388            )389        elif arg == "ompd_rel_parallel_handle":390            addr_handle = addr_space.addr_space391            threadId = gdb.selected_thread().ptid[1]392            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)393            parallel_handle = ompdModule.call_ompd_get_curr_parallel_handle(394                thread_handle395            )396            ompdModule.test_ompd_rel_parallel_handle(parallel_handle)397        elif arg == "ompd_initialize":398            ompdModule.test_ompd_initialize()399        elif arg == "ompd_get_api_version":400            ompdModule.test_ompd_get_api_version()401        elif arg == "ompd_get_version_string":402            ompdModule.test_ompd_get_version_string()403        elif arg == "ompd_finalize":404            ompdModule.test_ompd_finalize()405        elif arg == "ompd_process_initialize":406            ompdModule.call_ompd_initialize()407            ompdModule.test_ompd_process_initialize()408        elif arg == "ompd_device_initialize":409            ompdModule.test_ompd_device_initialize()410        elif arg == "ompd_rel_address_space_handle":411            ompdModule.test_ompd_rel_address_space_handle()412        elif arg == "ompd_get_omp_version":413            addr_handle = addr_space.addr_space414            ompdModule.test_ompd_get_omp_version(addr_handle)415        elif arg == "ompd_get_omp_version_string":416            addr_handle = addr_space.addr_space417            ompdModule.test_ompd_get_omp_version_string(addr_handle)418        elif arg == "ompd_get_curr_task_handle":419            addr_handle = addr_space.addr_space420            threadId = gdb.selected_thread().ptid[1]421            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)422            ompdModule.test_ompd_get_curr_task_handle(thread_handle)423        elif arg == "ompd_get_task_parallel_handle":424            addr_handle = addr_space.addr_space425            threadId = gdb.selected_thread().ptid[1]426            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)427            task_handle = ompdModule.call_ompd_get_curr_task_handle(thread_handle)428            ompdModule.test_ompd_get_task_parallel_handle(task_handle)429        elif arg == "ompd_get_generating_task_handle":430            addr_handle = addr_space.addr_space431            threadId = gdb.selected_thread().ptid[1]432            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)433            task_handle = ompdModule.call_ompd_get_curr_task_handle(thread_handle)434            ompdModule.test_ompd_get_generating_task_handle(task_handle)435        elif arg == "ompd_get_scheduling_task_handle":436            addr_handle = addr_space.addr_space437            threadId = gdb.selected_thread().ptid[1]438            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)439            task_handle = ompdModule.call_ompd_get_curr_task_handle(thread_handle)440            ompdModule.test_ompd_get_scheduling_task_handle(task_handle)441        elif arg == "ompd_get_task_in_parallel":442            addr_handle = addr_space.addr_space443            threadId = gdb.selected_thread().ptid[1]444            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)445            parallel_handle = ompdModule.call_ompd_get_curr_parallel_handle(446                thread_handle447            )448            ompdModule.test_ompd_get_task_in_parallel(parallel_handle)449        elif arg == "ompd_rel_task_handle":450            addr_handle = addr_space.addr_space451            threadId = gdb.selected_thread().ptid[1]452            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)453            task_handle = ompdModule.call_ompd_get_curr_task_handle(thread_handle)454            ompdModule.test_ompd_rel_task_handle(task_handle)455        elif arg == "ompd_task_handle_compare":456            addr_handle = addr_space.addr_space457            threadId = gdb.selected_thread().ptid[1]458            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)459            task_handle1 = ompdModule.call_ompd_get_curr_task_handle(thread_handle)460            task_handle2 = ompdModule.call_ompd_get_generating_task_handle(task_handle1)461            ompdModule.test_ompd_task_handle_compare(task_handle1, task_handle2)462            ompdModule.test_ompd_task_handle_compare(task_handle2, task_handle1)463        elif arg == "ompd_get_task_function":464            addr_handle = addr_space.addr_space465            threadId = gdb.selected_thread().ptid[1]466            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)467            task_handle = ompdModule.call_ompd_get_curr_task_handle(thread_handle)468            ompdModule.test_ompd_get_task_function(task_handle)469        elif arg == "ompd_get_task_frame":470            addr_handle = addr_space.addr_space471            threadId = gdb.selected_thread().ptid[1]472            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)473            task_handle = ompdModule.call_ompd_get_curr_task_handle(thread_handle)474            ompdModule.test_ompd_get_task_frame(task_handle)475        elif arg == "ompd_get_state":476            addr_handle = addr_space.addr_space477            threadId = gdb.selected_thread().ptid[1]478            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)479            ompdModule.test_ompd_get_state(thread_handle)480        elif arg == "ompd_get_display_control_vars":481            addr_handle = addr_space.addr_space482            ompdModule.test_ompd_get_display_control_vars(addr_handle)483        elif arg == "ompd_rel_display_control_vars":484            ompdModule.test_ompd_rel_display_control_vars()485        elif arg == "ompd_enumerate_icvs":486            addr_handle = addr_space.addr_space487            ompdModule.test_ompd_enumerate_icvs(addr_handle)488        elif arg == "ompd_get_icv_from_scope":489            addr_handle = addr_space.addr_space490            threadId = gdb.selected_thread().ptid[1]491            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)492            parallel_handle = ompdModule.call_ompd_get_curr_parallel_handle(493                thread_handle494            )495            task_handle = ompdModule.call_ompd_get_curr_task_handle(thread_handle)496            ompdModule.test_ompd_get_icv_from_scope_with_addr_handle(addr_handle)497            ompdModule.test_ompd_get_icv_from_scope_with_thread_handle(thread_handle)498            ompdModule.test_ompd_get_icv_from_scope_with_parallel_handle(499                parallel_handle500            )501            ompdModule.test_ompd_get_icv_from_scope_with_task_handle(task_handle)502        elif arg == "ompd_get_icv_string_from_scope":503            addr_handle = addr_space.addr_space504            ompdModule.test_ompd_get_icv_string_from_scope(addr_handle)505        elif arg == "ompd_get_tool_data":506            ompdModule.test_ompd_get_tool_data()507        elif arg == "ompd_enumerate_states":508            ompdModule.test_ompd_enumerate_states()509        else:510            print("Invalid API.")511 512 513class ompd_bt(gdb.Command):514    """Turn filter for 'bt' on/off for output to only contain frames relevant to the application or all frames."""515 516    def __init__(self):517        self.__doc__ = 'Turn filter for "bt" output on or off. Specify "on continued" option to trace worker threads back to master threads.\n usage: ompd bt on|on continued|off'518        super(ompd_bt, self).__init__("ompd bt", gdb.COMMAND_STACK)519 520    def invoke(self, arg, from_tty):521        global ff522        global addr_space523        global icv_map524        global ompd_scope_map525        if init_error():526            return527        if icv_map is None:528            icv_map = {}529            current = 0530            more = 1531            while more > 0:532                tup = ompdModule.call_ompd_enumerate_icvs(533                    addr_space.addr_space, current534                )535                (current, next_icv, next_scope, more) = tup536                icv_map[next_icv] = (current, next_scope, ompd_scope_map[next_scope])537            print('Initialized ICV map successfully for filtering "bt".')538 539        arg_list = gdb.string_to_argv(arg)540        if len(arg_list) == 0:541            print(542                'When calling "ompd bt", you must either specify "on", "on continued" or "off". Check "help ompd".'543            )544        elif len(arg_list) == 1 and arg_list[0] == "on":545            addr_space.list_threads(False)546            ff.set_switch(True)547            ff.set_switch_continue(False)548        elif arg_list[0] == "on" and arg_list[1] == "continued":549            ff.set_switch(True)550            ff.set_switch_continue(True)551        elif len(arg_list) == 1 and arg_list[0] == "off":552            ff.set_switch(False)553            ff.set_switch_continue(False)554        else:555            print(556                'When calling "ompd bt", you must either specify "on", "on continued" or "off". Check "help ompd".'557            )558 559 560# TODO: remove561class ompd_taskframes(gdb.Command):562    """Prints task handles for relevant task frames. Meant for debugging."""563 564    def __init__(self):565        self.__doc__ = "Prints list of tasks.\nUsage: ompd taskframes"566        super(ompd_taskframes, self).__init__("ompd taskframes", gdb.COMMAND_STACK)567 568    def invoke(self, arg, from_tty):569        global addr_space570        if init_error():571            return572        frame = gdb.newest_frame()573        while frame:574            print(frame.read_register("sp"))575            frame = frame.older()576        curr_task_handle = None577        if addr_space.threads and addr_space.threads.get(gdb.selected_thread().num):578            curr_thread_handle = curr_thread().thread_handle579            curr_task_handle = ompdModule.call_ompd_get_curr_task_handle(580                curr_thread_handle581            )582        if not curr_task_handle:583            return None584        prev_frames = None585        try:586            while 1:587                frames_with_flags = ompdModule.call_ompd_get_task_frame(588                    curr_task_handle589                )590                frames = (frames_with_flags[0], frames_with_flags[3])591                if prev_frames == frames:592                    break593                if not isinstance(frames, tuple):594                    break595                (ompd_enter_frame, ompd_exit_frame) = frames596                print(hex(ompd_enter_frame), hex(ompd_exit_frame))597                curr_task_handle = ompdModule.call_ompd_get_scheduling_task_handle(598                    curr_task_handle599                )600                prev_frames = frames601                if not curr_task_handle:602                    break603        except:604            traceback.print_exc()605 606 607def print_and_exec(string):608    """Helper function for ompd_step. Executes the given command in GDB and prints it."""609    print(string)610    gdb.execute(string)611 612 613class TempFrameFunctionBp(gdb.Breakpoint):614    """Helper class for ompd_step. Defines stop function for breakpoint on frame function."""615 616    def stop(self):617        global in_task_function618        in_task_function = True619        self.enabled = False620 621 622class ompd_step(gdb.Command):623    """Executes 'step' and skips frames irrelevant to the application / the ones without debug information."""624 625    def __init__(self):626        self.__doc__ = 'Executes "step" and skips runtime frames as much as possible.'627        super(ompd_step, self).__init__("ompd step", gdb.COMMAND_STACK)628 629    class TaskBeginBp(gdb.Breakpoint):630        """Helper class. Defines stop function for breakpoint ompd_bp_task_begin."""631 632        def stop(self):633            try:634                code_line = curr_thread().get_current_task().get_task_function()635                frame_fct_bp = TempFrameFunctionBp(636                    ("*%i" % code_line), temporary=True, internal=True637                )638                frame_fct_bp.thread = self.thread639                return False640            except:641                return False642 643    def invoke(self, arg, from_tty):644        global in_task_function645        if init_error():646            return647        tbp = self.TaskBeginBp("ompd_bp_task_begin", temporary=True, internal=True)648        tbp.thread = int(gdb.selected_thread().num)649        print_and_exec("step")650        while gdb.selected_frame().find_sal().symtab is None:651            if not in_task_function:652                print_and_exec("finish")653            else:654                print_and_exec("si")655 656 657def init_error():658    global addr_space659    if (gdb.selected_thread() is None) or (addr_space is None) or (not addr_space):660        print("Run 'ompd init' before running any of the ompd commands")661        return True662    return False663 664 665def main():666    ompd()667    ompd_init()668    ompd_threads()669    ompd_icvs()670    ompd_parallel_region()671    ompd_test()672    ompdtestapi()673    ompd_taskframes()674    ompd_bt()675    ompd_step()676 677 678if __name__ == "__main__":679    try:680        main()681    except:682        traceback.print_exc()683 684# NOTE: test code using:685# OMP_NUM_THREADS=... gdb a.out -x ../../projects/gdb_plugin/gdb-ompd/__init__.py686# ompd init687# ompd threads688