网页设计制作网站用什么软件,简述做个人网页的思路,游戏推广引流,用符号做照片的网站我有话说 因为时间和精力原因#xff0c;本文写的虎头蛇尾了#xff0c;除了启动调试与程序执行以外只有少量截图演示#xff0c;只是简单的说明。如果有需要可以联系我#xff0c;我有时间的话会把演示补上#xff0c;谢谢理解。 启动调试与程序执行
启动调试并传递参数…我有话说 因为时间和精力原因本文写的虎头蛇尾了除了启动调试与程序执行以外只有少量截图演示只是简单的说明。如果有需要可以联系我我有时间的话会把演示补上谢谢理解。 启动调试与程序执行
启动调试并传递参数
命令这三者在功能上没有任何区别 功能gdb --args exe args在启动dgb时传入参数set args args在启动gdb后运行程序前传入参数r/run args在启动gdb后运行程序时传入参数 测试代码
#include iostream
using namespace std;int main(int argc, char** argv) {cout i have argc arguments there are my arguments: endl;for (int i 0; i argc; i) {cout argv[i] endl;}return 0;
} 不传入参数 三种传入参数的方法 附加进进程 附加进进程主要是用于调试已经启动的进程在附加进进程后进程会进入追踪暂停状态tracing stop / t 状态当退出gdb时进程会继续运行。
附加进进程查看进程id的方法gdb attach pidps -ajx gdb --pid pidps -aux 测试代码
#include iostream
#include thread
#include chrono
using namespace std;int main() {size_t i 1;while (true) {cout 这是第 i 次循环 endl;this_thread::sleep_for(chrono::seconds(1));}return 0;
} 测试结果 逐过程调试和逐语句调试以及退出当前函数
命令功能next/n 逐过程调试 单步执行step-over遇到函数跳过函数step/s逐语句调试 单步执行step-into遇到函数进入函数continue/c运行到下一个断点处finish退出当前函数 测试代码
#include iostream
#include string
using namespace std;void test() {string str gdb;str welcome;str you;cout str endl;
}int main() {test();return 0;
} 测试结果 退出调试
命令功能detach 分离当前正在调试的进程必须处于启动状态quit/q退出gdb 测试代码
#include iostream
#include thread
#include chrono
using namespace std;int main() { cout enter main function endl;int i 0;for (;;) {cout i have looped i times endl;this_thread::sleep_for(chrono::seconds(1));}return 0;
} 测试结果 断点管理
设置断点
命令功能break/b filename : line在源代码的某一行设置断点当调试的程序为单文件程序时可以省略文件名b func_name 为函数设置断点。如果有同名函数就为所有同名函数设置断点 如果只想为特定的函数设置断点就需要添加限定符以便区分到底是为哪个函数设置断点 rb regex为满足正则表达式的函数设置断点b location if expression设置条件断点当条件成立时断点就会停止进程。常用在循环中但其他场景也能用tb location设置临时断点该断点只会命中一次b [ -] offest通过偏移量设置断点当前代码执行到某一行时如果要为当前代码行的前面某一行或者后面某一行设置断点就可以通过偏移量来达到快速设置断点的目的 测试代码
#include iostream
#include thread
#include chrono
using namespace std;void test() {cout enter test() endl;cout quit test() endl;
}void test(int) {cout enter test(int) endl;cout quit test(int) endl;
}void test(double) {cout enter test(int) endl;cout quit test(int) endl;
}void test_func() {cout enter test_func() endl;cout quit test_func() endl;
}int main() {int temp;cin temp;while (temp 100) {cout temp: temp endl;this_thread::sleep_for(chrono::milliseconds(500));}return 0;
}
# b func_name# 此时只会对class中的test_func和test_func(int)两个函数设置断点
b class::test_func()
b test_func(int)# rb regexrb test_func* # 这样就为所有以test_func开头的函数设置了断点查看、禁用、删除断点
命令功能i binfo breakpoints / info break查看所有断点i b id查看某一个断点disable/enable id禁用/启用断点disable id1 - id2禁用id1到id2号断点enable once id启动一次断点enable delete id启动断点在断点被击中后删除enable count times id启动断点在该断点被击中times次后自动禁用ignore times id忽略前times次击中断点delete / clear删除所有断点clear 无法删除观察点和捕获点delete id删除断点delete id1 id2 ......删除id1、id2、......号断点delete id1 - id2删除id1到id2号断点delete id1 - id2 id3 - id4 ......删除id1到id2、id3到id4、......号断点clear func_name删除函数内所有的断点如果存在同名函数那么所有同名函数中的断点都会被删除clear filename:line删除文件中某一行的断点 查看、修改变量
查看变量
查看变量 命令功能show args查看命令行参数info(i) args查看函数参数参数必须要有名字才能查看i locals查看局部变量print(p) variable查看变量的值 set print null-stop 设置字符串的显示规则查看字符串变量时到0停止set print pretty设置结构体显示规则让结构体中每个字段占一行set print array on设置数组显示规则让数组中的每个元素各占一行p gdb内置函数如 sizeofstrlenstrcpy 测试代码
#include iostream
using namespace std;void test1(int, double, const char*) {cout enter test(int, double, const char*) endl;cout exit test(int, double, const char*) endl;
}void test2(int i, const char* str) {cout enter test2(int i, const char* str) endl;cout exit test2(int i, const char* str) endl;
}int main() {test1(114514, 79856.33, hello);test2(222222, world);return 0;
} 修改变量
命令功能print/p variable val修改包括普通变量成员变量结构体类等可以用来控制程序的执行流程p gdb内置函数通过调用gdb内置函数来修改变量 p strcpy(str, this is string) 查看、修改内存
# 查看内存
# n 是显示内存的长度以f和u的读取方式显示n个数据
# f 是显示格式x是十六进制d是十进制u是无符号十六进制o是八进制t是二进制f是浮点s是字符串
# u 是单位b是单字节h是双字节w是四字节g是八字节
# nfu都可省略 n省略时默认为1f省略时为你上一次指定的格式如果没有则为xu省略时为你上一次指定的单位如果没有则为wx /nfu addr# 修改内存
# var可写可不写写了是为了避免set与其他单词组成命令
# 如set width就是gdb内置命令
setvaraddr value 寄存器的查看和修改 寄存器的查看和修改一般用在无调试符号的程序中release版本。
查看寄存器
命令 功能i registers查看所有通用寄存器i all-registers查看所有寄存器i r name查看某一个寄存器 当函数的参数小于等于6个时会将参数放在寄存器中否则会放入函数栈中。 如果查看的寄存器中的值是一个字符串可以结合p (char*) addr 来查看其中的内容。 修改寄存器
命令功能i line 行号查看行号对应代码的汇编地址disassemble反汇编set var $pc/rip addrpc/ripprogram counter寄存器用来保存程序中下一条要执行的指令可以通过修改pc/rip寄存器来改变程序执行的流程p $pc/rip addr同上 源代码的查看和管理
命令功能list / l显示源代码第一次默认显示10行前后各5行之后每次都向后显示10行l -向前显示list dir : line查看指定文件指定行代码set listsize value设置每次显示的行数list name查看指定函数的代码如果有同名函数就会把所有同名函数显示出来。 可以添加域限定符::来指定显示哪一个同名函数 可以通过添加dir : func name来限定查看哪一个文件中的函数search regex从当前行开始向后搜索第一个满足正则表达式的源代码搜索到之后按回车表示以当前正则表达式继续搜索下一个forward-search regex同search regexreverse-search regex从当前行开始向前搜索第一个满足正则表达式的源代码搜索到之后按回车表示以当前正则表达式继续搜索下一个show directories查看源代码的查找目录一般是程序的工作目录和当前所在目录directory path设置源代码的查找目录 函数调用栈管理
命令功能backtrace/bt查看栈回溯信息frame/f frame id / frame addr切换栈帧info f id查看栈帧信息 这些命令用来检查死锁、无限递归等问题。