void dump_code_vars() { int i; GtkTextIter aniter; GtkTextMark *mark; GdkRectangle coderect; int vbuf_start, vbuf_end; printf("+++ CODE +++\n"); printf("selected_code_line=%d, Selected_Code_Addr=%04X, Code_Selected=%d\n", selected_code_line, Selected_Code_Addr, Code_Selected); printf("ram=%04X, SP=%04X, PC=%04X\n", (WORD)ram, (WORD)(STACK - ram), (WORD)(PC - ram)); do_break("\n"); // printf("Codeline table\n"); // for (i = 0; i < 4; i++) // printf("addr=%04X line=%d\n", i, codelines[i]); gtk_text_view_get_visible_rect(GTK_TEXT_VIEW(codetext), &coderect); gtk_text_view_get_line_at_y(GTK_TEXT_VIEW(codetext), &aniter, coderect.y, NULL); vbuf_start = gtk_text_iter_get_line(&aniter); gtk_text_view_get_line_at_y(GTK_TEXT_VIEW(codetext), &aniter, coderect.y+coderect.height, NULL); vbuf_end = gtk_text_iter_get_line(&aniter); printf("coderect: x=%d y=%d width=%d height=%d\n", coderect.x, coderect.y, coderect.width, coderect.height); printf("visible: start=%d end=%d\n", vbuf_start, vbuf_end); printf("--- CODE ---\n"); }
/* void bluetooth(void) { unsigned int redata,Ddata,choice; if(identityset==1) { redatah=LPLD_UART_GetChar(UART4); if(redatah==255) { identityset=0; } } if(identityset==2) { identityset=0; redata=LPLD_UART_GetChar(UART4)+redatah*256; choice=redata/4096; redata=redata%4096; Ddata=redata/256*100+redata/16%16*10+redata%16; switch(choice) { case 0: turnleft_time_set=Ddata*10;break; case 1: testvalue1=Ddata;break;//将想要实时修改的全局变量替换掉null 在串口调试助手中 case 2: PID_KP=Ddata;break;//输入四位的十六进制字符串 当做十进制的输入就可以了 case 3: testvalue3=Ddata;break;//第一个数位你想要改变的变量对应编号 case 4: testvalue4=Ddata;break; case 5: testvalue5=Ddata;break; case 6: haoswitch=Ddata;break; //case 7: kd1=Ddata;break; //case 8: kd2=Ddata;break; //case 9: kd3=Ddata;break; //case 10: kd4=Ddata;break; //case 11: kd5=Ddata;break; //case 12: kd6=Ddata;break; //case 13: jiuzheng=Ddata;break; //case 14: null=Ddata;break; //case 15: null=Ddata;break; default : break; } } identityset++; } void sendblue(int a,int b) { char sendbluedata[2]; sendbluedata[0]=a*16+b/256; sendbluedata[1]=b%256; LPLD_UART_PutCharArr(UART4,(char*)sendbluedata,2); } */ void do_control(void) { switch (routechoice) { case C_AHEAD: do_goahead(); break; case C_GETCORNER: do_getcorner(); break; case C_LEFT: do_turnleft(); break; case C_RIGHT: do_turnright(); break; case C_STOP: do_stop(); break; case C_AROUND: do_turnaround(); break; case C_BREAK: do_break(); break; case C_START: do_start(); break; case C_LETSWIN: do_letswin(); break; default: do_stop(); } }
void erts_do_break_handling(void) { /* * Most functions that do_break() calls are intentionally not thread safe; * therefore, make sure that all threads but this one are blocked before * proceeding! */ erts_smp_thr_progress_block(); /* call the break handling function, reset the flag */ do_break(); ResetEvent(erts_sys_break_event); ERTS_UNSET_BREAK_REQUESTED; erts_smp_thr_progress_unblock(); }
void erts_do_break_handling(void) { struct termios temp_mode; int saved = 0; /* * Most functions that do_break() calls are intentionally not thread safe; * therefore, make sure that all threads but this one are blocked before * proceeding! */ erts_smp_thr_progress_block(); /* during break we revert to initial settings */ /* this is done differently for oldshell */ if (using_oldshell && !replace_intr) { SET_BLOCKING(1); } else if (isatty(0)) { tcgetattr(0,&temp_mode); tcsetattr(0,TCSANOW,&initial_tty_mode); saved = 1; } /* call the break handling function, reset the flag */ do_break(); ERTS_UNSET_BREAK_REQUESTED; fflush(stdout); /* after break we go back to saved settings */ if (using_oldshell && !replace_intr) { SET_NONBLOCKING(1); } else if (saved) { tcsetattr(0,TCSANOW,&temp_mode); } erts_smp_thr_progress_unblock(); }
/* * The function "mon()" is the dialog user interface, called * from the simulation just after program start. */ void mon(void) { register int eoj = 1; static char cmd[LENCMD]; tcgetattr(0, &old_term); if (x_flag) { if (do_getfile(xfn) == 0) do_go(); } while (eoj) { next: printf(">>> "); fflush(stdout); if (fgets(cmd, LENCMD, stdin) == NULL) { putchar('\n'); goto next; } switch (*cmd) { case '\n': do_step(); break; case 't': do_trace(cmd + 1); break; case 'g': do_go(); break; case 'd': do_dump(cmd + 1); break; case 'l': do_list(cmd + 1); break; case 'm': do_modify(cmd + 1); break; case 'f': do_fill(cmd + 1); break; case 'v': do_move(cmd + 1); break; case 'x': do_reg(cmd + 1); break; case 'p': do_port(cmd + 1); break; case 'b': do_break(cmd + 1); break; case 'h': do_hist(cmd + 1); break; case 'z': do_count(cmd + 1); break; case 'c': do_clock(); break; case 's': do_show(); break; case '?': do_help(); break; case 'r': do_getfile(cmd + 1); break; case '!': do_unix(cmd + 1); break; case 'q': eoj = 0; break; default: puts("what??"); break; } } }
void hook_line(lua_State* L, lua_Debug* ar) { dict* file_dictionary = NULL; if (L == NULL || ar == NULL) { return; } lua_getinfo(L, "Sn", ar); if (ar->currentline <= 0) { return; } if (debugger_step_count > 0) { // 避免总在同一行打转 if (last_breaked.currentline != ar->currentline || last_breaked.source != ar->source) { --debugger_step_count; if (debugger_step_count <= 0) { do_break(L, ar); return; } } } if (debugger_next_count > 0) { // 避免总在同一行打转 if (last_breaked.currentline != ar->currentline || last_breaked.source != ar->source) { lua_Debug caller; int frame = debugger_next_start_frame; int ok = 0; int be_checked = 0; int be_called = 0; // 检查整个栈判断是否走到当前函数内部 while ((ok = lua_getstack(L, frame, &caller)) == 1 && lua_getinfo(L, "S", &caller)) { be_checked = 1; if (debugger_next_linedefined == caller.linedefined && strcmp(debugger_next_source, caller.source) == 0) { be_called = 1; break; } ++frame; } // 此时ok == 0,表示自己已经是顶层调用,next应该被取消 if (be_checked == 0) { debugger_next_count = 0; } else { if (be_called == 0) { --debugger_next_count; debugger_next_linedefined = ar->linedefined; strncpy(debugger_next_source, ar->source, sizeof(debugger_next_source) - 1); } if (debugger_next_count <= 0) { do_break(L, ar); return; } } } } file_dictionary = dictFetchValue(breakpoint_dictionary, (const void*)ar->currentline); if (file_dictionary != NULL) { int needBreak = 0; const char* file_name = trim_path(ar->source); breakpoint_info* bp = dictFetchValue(file_dictionary, file_name); if (bp == NULL) { return; } if (bp->type & breakpoint_type_condition) { int n = lua_gettop(L); lua_rawgeti(L, LUA_REGISTRYINDEX, bp->conditionFunction); if (lua_type(L, -1) == LUA_TFUNCTION) { // 测试条件是否为true if (lua_pcall(L, lua_gettop(L) - 1 - n, LUA_MULTRET, 0) == 0) { int resultAmount = lua_gettop(L) - n; if (resultAmount > 0 && lua_type(L, -resultAmount) == LUA_TBOOLEAN) { if (lua_toboolean(L, -resultAmount)) { needBreak = 1; } } } } lua_pop(L, lua_gettop(L) - n); } else { needBreak = 1; } // 释放临时断点 if (bp->type & breakpoint_type_temp) { dictDelete(file_dictionary, file_name); luaL_unref(L, LUA_REGISTRYINDEX, bp->conditionFunction); free(bp); } if (needBreak) { do_break(L, ar); } } }