用 GDB 调试程序简介[转自csdn]

pwn入门:详解gdb调试程序的常见命令 本文主要以对一个程序的调试过程为例,介绍gdb调试器的常见命令,并直观的展示所谓“溢出”覆盖的效果以及大小端序的问题。涉及的知识点包括:pwn题目环境的部署、gdb调试的常见命令、大小端序的影响、简单解pwn题目脚本的编写。 阅读详情

使用gdb调试程序简介

一、初始化
    输入gdb进入gdb调试环境。或者直接输入gdb + progfile来加载文件。
注意该文件是使用gcc(或g++)编译得到的。为了使 gdb 正常工作, 必须
使你的程序在编译时包含调试信息,编译时必须使用-g参数来。
    或者进入gdb环境后,通过命令file + progfile来加载需要调试的可
执行文件文件。

    查看源代码:list [函数名][行数]
   
    设置程序运行参数:set args
   
二、暂停程序   
    gdb可以使用几种方式来暂停程序:断点,观察点,捕捉点,信号,线
程停止。当程序被暂停后,可以使用continue、next、setp来继续执行程序。
 continue 执行到下一暂停点或程序结束。
 next         执行一行源代码但不进入函数内部。
 setp        执行一行源代码而且进入函数内部。

    1、设置断点:
       a、break + [源代码行号][源代码函数名][内存地址]
       b、break ... if condition   ...可以是上述任一参数,condition
    条件。例如在循环体中可以设置break ... if i = 100 来设置循环次数。
 
    2、设置观察点:
       a、watch + [变量][表达式]  当变量或表达式值改变时即停住程序。
       b、rwatch + [变量][表达式] 当变量或表达式被读时,停住程序。
       c、awatch + [变量][表达式] 当变量或表达式被读或被写时,停住程序。

    3、设置捕捉点:
       catch + event  当event发生时,停住程序。event可以是下面的内容:
 1)、throw 一个C++抛出的异常。(throw为关键字)
 2)、catch 一个C++捕捉到的异常。(catch为关键字)
 3)、exec 调用系统调用exec时。(exec为关键字,目前此功能只在HP-UX下有用)
 4)、fork 调用系统调用fork时。(fork为关键字,目前此功能只在HP-UX下有用)
 5)、vfork 调用系统调用vfork时。(vfork为关键字,目前此功能只在HP-UX下有用)
 6)、load 或 load 载入共享库(动态链接库)时。(load为关键字,
            目前此功能只在HP-UX下有用)
 7)、unload 或 unload 卸载共享库(动态链接库)时。(unload为关
            键字,目前此功能只在HP-UX下有用)

    4、捕捉信号:
       handle + [argu] + signals
       signals:是Linux/Unix定义的信号,SIGINT表示中断字符信号,也就是
       Ctrl+C的信号,SIGBUS表示硬件故障的信号;SIGCHLD表示子进程状态改
       变信号; SIGKILL表示终止程序运行的信号,等等。
       argu:
   nostop   当被调试的程序收到信号时,GDB不会停住程序的运行,但
                   会打出消息告诉你收到这种信号。
   stop     当被调试的程序收到信号时,GDB会停住你的程序。
   print    当被调试的程序收到信号时,GDB会显示出一条信息。
   noprint  当被调试的程序收到信号时,GDB不会告诉你收到信号的信息。
   pass or noignore    当被调试的程序收到信号时,GDB不处理信号。
                   这表示,GDB会把这个信号交给被调试程序会处理。
  nopass or ignore     当被调试的程序收到信号时,GDB不会让被调
                   试程序来处理这个信号。

     5、线程中断:
        break [linespec] thread [threadno] [if ...]
        linespec 断点设置所在的源代码的行号。如: test.c:12表示文件为
                 test.c中的第12行设置一个断点。
        threadno 线程的ID。是GDB分配的,通过输入info threads来查看正在
                 运行中程序的线程信息。
        if ...   设置中断条件。


三、查看信息
     1、查看数据
        print  variable        查看变量
        print 
*array@len      查看数组(array是数组指针,len是需要数据长度)
        可以通过添加参数来设置输出格式:
            /x 按十六进制格式显示变量。
            /d 按十进制格式显示变量。
            /u 按十六进制格式显示无符号整型。
            /o 按八进制格式显示变量。
            /t 按二进制格式显示变量。
            /a 按十六进制格式显示变量。
            /c 按字符格式显示变量。
            /f 按浮点数格式显示变量。

      2、查看内存
         examine /n f u + 内存地址(指针变量)
         n 表示显示内存长度
         f 表示输出格式(见上)
         u 表示字节数制定(b 单字节;h 双字节;w 四字节;g 八字节;默认为四字节)
  如:
             x /10cw pFilePath  (pFilePath为一个字符串指针,指针占4字节)
             x 为examine命令的简写。

      3、查看栈信息      
  backtrace [-n][n]
         n  表示只打印栈顶上n层的栈信息。
        -n 表示只打印栈底上n层的栈信息。
         不加参数,表示打印所有栈信息。


附注:
基本gdb命令:
---------------------------------------------------------------------
命令          简写         功能
---------------------------------------------------------------------
file                             装入想要调试的可执行文件.
kill             k              终止正在调试的程序.
list             l               列出产生执行文件的源代码的一部分.
next           n              执行一行源代码但不进入函数内部.
step          s              执行一行源代码而且进入函数内部.
continue  c               继续执行程序,直至下一中断或者程序结束。
run            r               执行当前被调试的程序.
quit           q               终止 gdb.
watch                        使你能监视一个变量的值而不管它何时被改变.
catch                         设置捕捉点.
thread       t               查看当前运行程序的线程信息.
break        b              在代码里设置断点, 这将使程序执行到这里时被挂起.
make                        使你能不退出 gdb 就可以重新产生可执行文件.
shell                         使你能不离开 gdb 就执行 UNIX shell 命令. 
print          p              打印数据内容。
examine  x               打印内存内容。
backtrace bt             查看函数调用栈的所有信息。
----------------------------------------------------------------------

 

gdb 应用举例
    本节用一个实例教你一步步的用 gdb 调试程序. 被调试的程序相当的简单, 但它展示了 gdb 的典型应用.
 
    下面列出了将被调试的程序. 这个程序被称为 greeting , 它显示一个简单的问候, 再用反序将它列出.
#include  <stdio.h>



main ()

{

  char my_string[] = "hello there";



  my_print (my_string);

  my_print2 (my_string);

}



void my_print (char *string)

{

  printf ("The string is %s ", string);

}



void my_print2 (char *string)

{

  char *string2;

  int size, i;



  size = strlen (string);

  string2 = (char *) malloc (size + 1);

  for (i = 0; i < size; i++)

    string2[size - i] = string[i];

  string2[size+1] = `';

  printf ("The string printed backward is %s ", string2);

}
    用下面的命令编译它:
 
gcc -o test test.c
    这个程序执行时显示如下结果:
The string is hello there

The string printed backward is
    输出的第一行是正确的, 但第二行打印出的东西并不是我们所期望的. 我们所设想的输出应该是:
The string printed backward is ereht olleh
    由于某些原因, my_print2 函数没有正常工作. 让我们用  gdb 看看问题究竟出在哪儿, 先键入如下命令:
 
gdb greeting

--------------------------------------------------------------------------------
注意: 记得在编译 greeting 程序时把调试选项打开. 
--------------------------------------------------------------------------------

    如果你在输入命令时忘了把要调试的程序作为参数传给 gdb , 你可以在 gdb 提示符下用 file 命令来载入它:
 
(gdb) file greeting
    这个命令将载入 greeting 可执行文件就象你在 gdb 命令行里装入它一样.
    这时你能用 gdb 的 run 命令来运行 greeting 了. 当它在 gdb 里被运行后结果大约会象这样:

(gdb) run

Starting program: /root/greeting

The string is hello there

The string printed backward is

Program exited with code 041
    这个输出和在 gdb 外面运行的结果一样. 问题是, 为什么反序打印没有工作? 为了找出症结所在, 我们可以在 my_print2 函数的 for 语句后设一个断点, 具体的做法是在 gdb 提示符下键入 list 命令三次, 列出源代码:
(gdb) list

(gdb) list

(gdb) list

--------------------------------------------------------------------------------
技巧:  在 gdb 提示符下按回车健将重复上一个命令. 
--------------------------------------------------------------------------------

    第一次键入 list 命令的输出如下:
 
1      #include  <stdio.h>

2

3      main ()

4      {

5        char my_string[] = "hello there";

6

7        my_print (my_string);

8        my_print2 (my_string);

9      }

10
    如果按下回车, gdb 将再执行一次 list 命令, 给出下列输出:
 
11      my_print (char *string)

12      {

13        printf ("The string is %s ", string);

14      }

15

16      my_print2 (char *string)

17      {

18        char *string2;

19        int size, i;

20
    再按一次回车将列出 greeting 程序的剩余部分:
21        size = strlen (string);

22        string2 = (char *) malloc (size + 1);

23        for (i = 0; i < size; i++)

24          string2[size - i] = string[i];

25        string2[size+1] = `';

26        printf ("The string printed backward is %s ", string2);

27      }
    根据列出的源程序, 你能看到要设断点的地方在第24行, 在 gdb 命令行提示符下键入如下命令设置断点:
(gdb) break 24
    gdb 将作出如下的响应:
Breakpoint 1 at 0x139: file greeting.c, line 24

(gdb)
 
    现在再键入 run 命令, 将产生如下的输出:
 
Starting program: /root/greeting

The string is hello there



Breakpoint 1, my_print2 (string = 0xbfffdc4 "hello there") at greeting.c :24

24  string2[size-i]=string[i]
    你能通过设置一个观察 string2[size - i] 变量的值的观察点来看出错误是怎样产生的, 做法是键入:
 
(gdb) watch string2[size - i]
    gdb 将作出如下回应:
Watchpoint 2: string2[size - i]
    现在可以用 next 命令来一步步的执行 for 循环了:
 
(gdb) next
    经过第一次循环后,  gdb 告诉我们 string2[size - i] 的值是 `h`. gdb 用如下的显示来告诉你这个信息:
 
Watchpoint 2, string2[size - i]

Old value = 0 `00'

New value = 104 `h'

my_print2(string = 0xbfffdc4 "hello there") at greeting.c:23

23 for (i=0; i<size; i++)
    这个值正是期望的. 后来的数次循环的结果都是正确的. 当 i=10 时, 表达式 string2[size - i] 的值等于 `e`,  size - i 的值等于 1, 最后一个字符已经拷到新串里了.
    如果你再把循环执行下去, 你会看到已经没有值分配给 string2[0] 了,  而它是新串的第一个字符, 因为 malloc 函数在分配内存时把它们初始化为空(null)字符. 所以 string2 的第一个字符是空字符. 这解释了为什么在打印 string2 时没有任何输出了.

    现在找出了问题出在哪里, 修正这个错误是很容易的. 你得把代码里写入 string2 的第一个字符的的偏移量改为 size - 1 而不是 size. 这是因为 string2 的大小为 12, 但起始偏移量是 0, 串内的字符从偏移量 0 到 偏移量 10, 偏移量 11 为空字符保留.

    为了使代码正常工作有很多种修改办法. 一种是另设一个比串的实际大小小 1 的变量. 这是这种解决办法的代码:

#include  <stdio.h>



main ()


{

  char my_string[] = "hello there";



  my_print (my_string);

  my_print2 (my_string);

}



my_print (char *string)

{

  printf ("The string is %s ", string);

}



my_print2 (char *string)

{

  char *string2;

  int size, size2, i;



  size = strlen (string);

  size2 = size -1;

  string2 = (char *) malloc (size + 1);

  for (i = 0; i < size; i++)

    string2[size2 - i] = string[i];

  string2[size] = `';

  printf ("The string printed backward is %s ", string2);

}

手把手教你用Simulink搭建DSOGI-PLL模型(附完整代码下载) 本文详细介绍了在Simulink中搭建高鲁棒性DSOGI-PLL模型的完整工程实践指南。针对传统锁相环在非理想电网下的不足,文章深入剖析了双二阶广义积分器锁相环(DSOGI-PLL)的核心原理与优势,并提供了从模块构建、系统组装到参数整定与测试验证的全流程手把手教程,附有完整代码下载,助力工程师应对谐波、电压跌落等复杂电网工况。 阅读详情

相关推荐

数据库:关系运算整理大全(包括关系代数、元组关系演算、域关系演算)

数据库关系运算: 1. 关系代数(基本关系代数、附加关系代数、扩展关系代数) 2. 元组关系演算 3. 域关系演算

ysji's blog 1万+

gdb continue后如何暂停_Linux系统编程入门学习笔记4-GDB

一、什么是GDBGDB是由GNU软件系统社区提供的调试工具,GDB主要帮助程序员完成下面四个方面的功能。启动程序,按照自定义的要求随心所欲地运行程序让被调试的程序在所指定的断点住停住当程序停住时,可以检查此时程序中的变量内容debug二、如何使用GDB进行调试在生成可执行文件是选择-g选项生成调试信息,并且保证在使用gdb调试时源文件就在当前目录下。通过gdb 可执行文件名字,这一命令来启动gbd...

weixin_42501688的博客 677

ADS中HB仿真自动优化报错问题解决心得

在ADS HB仿真中自动优化出现报错被强制暂停,解决方法如下

yyyyyyyyyyjy的博客 6537

Python程序打包

1. 用Py2app打包(Mac) py2applet --make-setup myfile.py命令创建一个setup.py的打包脚本文件 python3 setup.py py2app命令运行打包脚本,生成app文件 setup.py文件说明(可以直接在EasyIcon网站下载icns格式的图标): # 需要打包的其它文件 DATA_FILES = ['Times New Roman Bol...

春风酿酒的博客 435

STM32F407+LAN8720网口不通?别慌,手把手教你用CubeMX和HAL库搞定RMII配置与调试

本文详细介绍了STM32F407与LAN8720网口不通的全面排查与解决方法,涵盖硬件检查、CubeMX配置、PHY芯片初始化和LWIP协议栈优化。通过RMII接口配置、时钟树设置和PHY芯片调试,帮助开发者快速定位并解决网络连接问题,提升嵌入式网络开发效率。

weixin_30457551的博客 506

看我如何用kali实时截获隔壁"小姐姐"的上网隐私(结尾有彩蛋)

看我如何用kali实时截获隔壁&amp;amp;amp;quot;小姐姐&amp;amp;amp;quot;的手机图片等信息(结尾有彩蛋哦) 首先圈下重点:《刑法》第二百八十五条 【非法侵入计算机信息系统罪;非法获取计算机信息系统数据、非法控制计算机信息系统罪】违反国家规定,侵入国家事务、国防建设、尖端科学技术领域的计算机信息系统的,处三年以下有期徒刑或者拘役。违反国家规定,侵入前款规定以外的计算机信息系统或者采用其他技术手段,获取该计算机信息系统中存储、处理或...

SoulCat 2万+

gdb x命令_GDB简易使用指南

GDB简介GNU调试器(GNU Debugger,简称GDB)是一款GNU软件系统中的标准调试器,现有GDB所能支持调试的编程语言有C、C++、Pascal以及FORTRAN。GDB具有极好的移携性,经过多个版本的调修与重新编译,如今许多的类UNIX操作系统上都可以使用GDB。GDB官网:GDB: The GNU Project Debugger​www.gnu.orgGDB和LLDB GNU调试...

weixin_39812142的博客 910

045、镜头模组公差链分析:从 Lens 到 Sensor 的装配公差累积与良率优化

本文深入分析了镜头模组从镜片到传感器各环节的公差累积问题及优化策略。文章首先剖析了四级公差链(镜片单体、镜筒装配、VCM定位、传感器贴装)的误差传递机制,指出各环节典型公差值及其影响(如5微米镜片偏差可导致0.02度光线偏折)。其次对比了最坏情况法与均方根法的差异,强调需考虑公差相关性(如镜片曲率与镜筒间隙的正相关性)。最后提出良率优化"三板斧":通过蒙特卡洛仿真优化公差分配、采用主动对准工艺在线补偿、建立数据反馈闭环系统,并结合"阴阳脸"案例说明如何定位根因(模具磨损+贴片机老化导致的误差叠加)。作者总结

sundong_81的博客 59

一、使用GDB调试程序

在 gdb 中,我们可以有以下几种暂停方式:断点(BreakPoint)、观察点(WatchPoint)、捕捉点(CatchPoint)、信号(Signals)、线程停止(Thread Stops)。GDB调试的是C/C++的程序,因此想要更好的调试程序,需要在编译时把调试信息加到可执行文件中,即使用编译器的 -g 参数。当进程被gdb停住时,你可以使用info program 来查看程序的是否在运行,进程号,被暂停的原因。如果没有-g,将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。

future_sky_word的博客 2151

Python爬招聘网站:Selenium+ActionChains破解滑动验证码,批量采集岗位数据(新手可跑)

通过本文实战,你不仅学会了用Selenium+ActionChains破解滑动验证码,还掌握了爬虫的核心优化思路——“模拟人类行为”是突破反爬的关键。这套逻辑不仅适用于招聘网站,还能迁移到其他有滑动验证码的平台(如电商、资讯网站)。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1186

PyQt 随笔:信号与槽的两种使用方法:@pyqtSlot 和 connect

在 PyQt 中,信号与槽是实现事件驱动的一种重要机制。通过信号与槽的连接,可以实现对象之间的通信,例如在用户界面中响应按钮点击事件或者数据的变化等。PyQt 提供了两种主要的方法来创建信号与槽的连接:@pyqtSlot 装饰器和 connect 方法。本文将详细介绍这两种方法,并提供相应的源代码示例。在上面的示例中,我们定义了一个名为。

QasdCpp的博客 763

GDB入门教程之暂停程序

GDB入门教程之暂停程序一、断点设置与查看二、观察点设置与查看三、捕捉点设置与查看四、修改停止点状态五、修改停止条件六、为停止点设定运行命令七、恢复程序运行 使用 GDB 调试程序时,在合适的时机暂停程序的运行是最基本且必须的操作。这里提到的合适时机暂停包括控制程序在哪行暂停、在什么条件下暂停、在收到什么信号时暂停等。 GDB 提供的暂停程序运行的方式包括:断点 (BreakPoint)、观察点 (WatchPoint)、捕捉点 (CatchPoint)、信号 (Signals)、线程停止 (Thread

嘟嘟的博客 6907

工业级4~20mA转0~3V信号调理电路原理图设计,已量产(电流传感器)

在工业现场,4~20mA 电流信号是模拟量传输的 “老熟人”—— 抗干扰强、能跑长距离,但嵌入式 MCU 的 ADC 一般只认电压信号。最近做项目时,我设计了一款能覆盖 0~25mA(含超量程冗余)、线性输出 0~3V 的调理电路,经过现场调试挺稳定,分享下细节。

不脱发的程序猿 525

用GDB调试程序

用GDB调试程序 说明:从优快云的网站上找到的GDB使用说明。原文标题:用GDB调试程序作者:haoel关键字:gdb 调试 c c++ gun网址链接:出处这篇文章非常好,所以转载了下来,作为收藏。 用GDB调试程序 GDB概述———— GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNI

address2的专栏 4963

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

GDB之(8)GDB-Server远程调试

GDB,全称GNU Debugger,是一个在GNU操作系统下的强大的程序调试工具,广泛应用于Unix及类Unix系统中用以调试多种编程语言编写的程序,尤其是C和C++语言。它由Richard Stallman于1980年代创建,至今仍然是开源社区中使用最为广泛的调试器之一。GDB允许程序员看到程序执行时的内部情况,诸如变量值、程序调用栈等信息,能够在程序执行到特定点时暂停,或者在出现错误时停下来。这就好比给程序员一副透视眼镜,能够洞察程序的内部运行机制。

梅花香自苦寒来,宝剑锋从磨砺出。 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

GDB调试程序 --转

  说明 从优快云的网站上找到的GDB使用说明。 原文标题:用GDB调试程序 作者:haoel (QQ是:753640,MSN是: haoel@hotmail.com) 关键字:gdb 调试 c c++ gun 这篇文章非常好,所以转载了下来,作为收藏。 GDB概述 GDB 是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许 ,各位比较喜欢那种图形...

xineohpanihc 157

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Linux下gdb调试工具介绍和gdb常用调试方法介绍

1、gdb介绍 2、gdb用法介绍  (1)生成带有调试信息的可运行程序 a>判断可运行程序是否带有调试信息? b>判断可执行文件是否带有调试信息的两种方法: (2)运行调试程序:(gdb)run、start区别 附加知识:启动带参可执行程序 (3)源码查看:(gdb)list(4)运行参数查看show (5)断点设置 设置断点、设置条件断点、查看断点、删除断点、禁用断点、运行某个断点 (6)堆栈  a>堆栈查看命令 b>栈帧(stack frame)介绍  c>函数调用过程中栈区变化 d>栈增长方向

hanxiaoyong_的博客 8071

GDB调试工具入门

可执行程序分为Release版本(发行版本)和Debug版本(调试版本),这两个版本都是用同一份源码编译出来的,平时直接使用gcc或者g++编译器生成的可执行程序就是Release版本,当我们要测试时,就要使用Debug版本,利用gdb工具可以将我们的可执行程序生成Debug版本。首先下载gdb调试工具,之后在编译可执行程序的时候直接使用 -g ,生成的可执行程序就是Debug版本,这个版本会添加更多的调试信息,所以占的存储空间也比较大,要使用gdb进行调试,必须在源代码生成二进制程序的时候, 加上。

weixin_63913420的博客 1713

用GDB调试程序(一)

说明 从优快云的网站上找到的GDB使用说明。 原文标题:用GDB调试程序 作者:haoel (QQ是:753640,MSN是: haoel@hotmail.com) 关键字:gdb 调试 c c++ gun 这篇文章非常好,所以转载了下来,作为收藏。

cwchenwu88的专栏 264

Linux笔记---调试工具GDB(gdb)

GDB,全称GNU Debugger,是一个功能强大的开源调试工具,广泛用于Unix和类Unix系统,以及Microsoft Windows和macOS平台。GDB允许开发者在程序执行过程中查看内部运行情况,帮助定位和修复程序中的错误。

2302_80372340的博客 5477

GDB调试程序的使用

GDB的使用: 举下面的程序为例: 写完程序之后输入“gcc  -g  gdb.c”,"gdb a.out",启动GDB对test进行调试,图如下:

zjq_smile的博客 587

打印所有堆栈信息 gdb_gdb基本命令

参考自:gdb基本命令(非常详细)_JIWilliams-优快云博客_gdb命令​blog.csdn.net本文介绍使用gdb调试程序的常用命令。 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。同时GDB也具有例如ddd这样的图形化的调试端。 一般来说,GDB主要完成下面四个...

weixin_39915081的博客 1477
上一篇: 一个批处理的扫描程序
下一篇: 怎样写Makefile
answerzy
博客等级 码龄24年 1粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值