gdb基础zt

C/C++中手动获取调用堆栈 当我们的程序core掉之后,如果能获取到core时的函数调用堆栈将非常有利于定位问题。在Windows下可以使用SEH机制;在Linux下通过gdb使用coredump文件即可。 但有时候由于某些错误导致堆栈被破坏,发生拿不到调用堆栈的情况。 一些基础预备知识本文不再详述,可以参考以下文章: 函数调用栈的获取原理分析寄存器、函数调用与栈帧 需要知道的信息: 函数调用对应的call 阅读详情
就调试本机可执行文件(即不是 Java* 或 perl 等)而言,使用 gdb 就对了。gdb 可用于源代码级调试,以及跟踪没有源代码的程序或检查某个终止的程序留下的核心文件。遗憾的是,当您从来没有使用过它,或者已经有一段时间没有使用它时,使用它来做这些工作可能很困难。图 1 展示了使用 gdb 来进行调试所需的每个命令。


Command Description
file load program
b set breakpoint
r run
c continue
s step (line)
si step (machine instruction)
n next (step over function call)
finish run until function returns
i r show all registers
i r show specific register
l list source
p display value
set args set command line arguments

图 1

  要将 gdb 用作源代码级调试器,请确保在包括调试符号的情况下编译程序;这就是 gcc 的 -g 选项。对于启动 gdb,您可以通过输入 gdb programname(此例中是 gdb simple),或者通过单独运行 gdb 本身并使用 file 命令加载可执行文件来达到目的。

  要设置基本的断点,您可以在某个函数名称或行号上中断。例如,b 27 将在当前文件的第 27 行上设置了一个断点。有两种使用函数名称的方式:b main 在函数 main 中的第一行可执行代码上中断,b *main 在 main 的入口地址上设置一个断点(如果打算单步调试函数的每条指令,这样是很有用的)。

  一旦设置了第一个断点,可使用 run 或 r 来启动程序并运行到第一个断点。还可以不带任何断点运行程序,如果您不知道程序是在何处崩溃的,这样将很有帮助。当您命中一个断点 c 或 continue 时,程序将恢复执行,直至命中下一个断点。

  step“单步”调试源代码行。Step instruction (si) 单步调试机器代码行(当您单步调试优化过的代码时,si 指令可能特别有用,这将在后面介绍)。 next 工作起来就像 step,但是它不跟踪进入函数调用(如果的确错误地跟踪进入了函数调用,可使用 finish 来完成该函数,然后在它返回的地方中断)。

  单独的 info register(i r)本身显示所有寄存器的值(浮点值除外),不过您可以指定一个寄存器名称。在 31 位系统上,通用寄存器被命名为 gpr0、gpr1、gpr2,等等;在 64 位系统上,它们被命名为 r0、r1、r2,等等。浮点寄存器遵循相同的命名约定:在 31 位系统上是 fpr0、fpr1、fpr2,等等;在 64 位系统上是 f0、f1、f2,等等。

  “l”列出程序当前停止位置周围的源代码。您还可以指定开始列出代码的行号或要列出的函数名称。print 允许您打印程序中任何变量的值。 print 的一个最好的优点在于,它会为您取出一个结构中的所有值,或允许您直接引用该结构的一部分:


Breakpoint 1, main () at simple.c:30
30 boink.boik = &r1;
(gdb) print boink
$3 = {boik = 0x0}
(gdb) print boink.boik
$4 = (int *) 0x0

  最后,set args 为程序设置命令行参数。您也可以在执行 run 时指定命令行参数,但是 set args 将使参数在 run 的多次执行中都有效。


gdb Post Mortem

  当程序意外地终止时,内核会尝试产生一个核心文件,以图判断发生了什么错误。然而,核心文件通常不是在默认设置值下产生的。这可以使用 ulimit 命令来改变。ulimit -c unlimited 帮助确保您获得应用程序的完整核心文件。

  虽然核心文件当前仅提供多线程应用程序中的有限的值,不过 2.5 版的开发内核已开始处理这个问题。预计 2.6 版的内核中会提供一些理想的线程改进。


Command Description
file load program
core load core file
bt back trace
where same as back trace
i f frame information
up move up stack
down move down stack
frame jump to frame
disassem display function’s machine code
i locals display local variable values

图 2

  图 2 突出显示了一系列便利的 post mortem 命令。


(gdb) file simple
Reading symbols from simple...done.
(gdb) core core
Core was generated by `./simple’.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /lib/libc.so.6...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/ld.so.1...done.
Loaded symbols for /lib/ld.so.1
#0 0x400ab738 in memcpy () from /lib/libc.so.6
(gdb) where
#0 0x400ab738 in memcpy () from /lib/libc.so.6
#1 0x40066e in main () at simple.c:34
#2 0x40041eb8 in __libc_start_main () from /lib/libc.so.6
#3 0x4004ac in _start ()
(gdb) i f
Stack level 0, frame at 0x7ffff7a0:
pswa = 0x400ab738 in memcpy; saved pswa 0x0
(FRAMELESS), called by frame at 0x7ffff7a0
Arglist at 0x7ffff7a0, args:
Locals at 0x7ffff7a0, Previous frame’s sp is 0x0
(gdb) up
#1 0x40066e in main () at simple.c:34
34 memcpy (doink.boik, boink.boik, sizeof(boink.boik));
(gdb) i locals
doink = {boik = 0x4019a0}
boink = {boik = 0x0}
(gdb) ptype boink.boik
type = int *
(gdb) print *boink.boik
Cannot access memory at address 0x0
(gdb) print *doink.boik
$1 = 4

图 3

  图 3 简要显示了一个核心程序的完整运行过程。同样,我们使用了 simple 程序。 但不是手动加载程序和核心文件,而是从命令行调入:


gdb simple core

  在加载符号之后,gdb 将指出程序在何处终止。注意当前帧 #0 包含前一节中计算的地址。gdb 将在 31 位系统上截去高位,仅显示指令地址。 还要注意帧 #1 包含 gpr14 中的返回地址。

  接着往下看,i f 提供了关于当前堆栈帧的信息。在堆栈帧中往上移到 main,这就是我们离开该帧的地方(即调用 memcpy 的地方)。简单的 i locals 提供了传递给 memcpy 的变量的值,其中一个变量 boink.boik 的值为 0x0。使用 ptype 来检查变量类型,这样将确认它是一个整型指针,并且如果目的是为了拷贝内容到其中,它就不应该是 0x0。最后一个选项是使用 print,通过一个星号(*)来解除指针引用,以便接收值。

处理优化过的代码

  先前,我曾提到当您在源代码级调试优化过的代码时,gdb 可能变得有点棘手。编译器优化一些代码的执行顺序以最大化性能。图 4 显示了这样一个例子。您可以看到行号如何从 32 切换到 30 然后又切换回 32。


(gdb) break main
Breakpoint 1 at 0x800007a8: file simple.c, line 32.
(gdb) r
Starting program: /home/grundym/foo/simple
Breakpoint 1, main () at simple.c:32
32 do_one_thing(&doink);
(gdb) s
30 doink.boik = &r1;
(gdb)
32 do_one_thing(&doink);
(gdb)
do_one_thing (pnum_times=0x1fffffff690) at simple.c:47
47 for (i = 0; i < 4; i++) {

图 4

  如何处理这种情况呢?使用 si 和 ni(next instruction;它类似 si,但是会跳过子例程调用)将非常有帮助。 在这个层次上,很好理解 zArchitecture 是有所帮助的。


(gdb) break *main
Breakpoint 1 at 0x80000794: file simple.c, line 27.
(gdb) display /i $pswa
(gdb) r
Starting program: /home/grundym/foo/simple

Breakpoint 1, main () at simple.c:27
27 {
1: x/i $pswa 0x80000794 : EB AF F0 50 00 24 stmg %r10,%r15,80(%r15)
(gdb) si
0x8000079a 27 {
1: x/i $pswa 0x8000079a : B9 04 00 1F lgr %r1,%r15
(gdb)
0x8000079e 27 {
1: x/i $pswa 0x8000079e : A7 FB FF 58 aghi %r15,-168
(gdb)
0x800007a2 in main () at simple.c:27
27 {
1: x/i $pswa 0x800007a2 : E3 10 F0 00 00 24 stg %r1,0(%r15)
(gdb)
32 do_one_thing(&doink);
1: x/i $pswa 0x800007a8 : 41 C0 F0 A0 la %r12,160(%r15)
(gdb)
30 doink.boik = &r1;
1: x/i $pswa 0x800007ac : C0 10 00 00 08 C2 larl %r1,0x80001930
(gdb)
0x800007b2 30 doink.boik = &r1;
1: x/i $pswa 0x800007b2 : E3 10 F0 A0 00 24 stg %r1,160(%r15)
(gdb)
32 do_one_thing(&doink);
1: x/i $pswa 0x800007b8 : B9 04 00 2C lgr %r2,%r12
(gdb)
0x800007bc 32 do_one_thing(&doink);
1: x/i $pswa 0x800007bc : C0 E5 FF FF FF 68 brasl %r14,0x8000068c
(gdb)
do_one_thing (pnum_times=0x1fffffff7f8) at simple.c:44
44 {
1: x/i $pswa 0x8000068c : EB BF F0 58 00 24 stmg %r11,%r15,88(%r15)
(gdb)

图 5

  图 5 显示了为调试而对程序进行的设置。首先在 main()的地址处设置一个断点,然后设置一个 display。display 是一个表达式,它在每次代码停止执行时打印有关信息。在此例中,display 被设置为显示当前指令地址处的指令。/i 是打印为反汇编代码的格式,而当前指令指针在值/寄存器(value/register)$pswa 中。

  单步调试代码,可以明显看出每条机器指令都与一行 c 代码相关联。 前四行与第 27 行(即函数 main 的开头)相关联。前四行是典型的函数引入操作,它们保存寄存器、堆栈指针并调整堆栈。当关联的行号变为 32 时,我们就设置好了对 do_one_thing() 的函数调用。

  当 display 在工作时,它显示 x /i 作为实际数据显示之前的命令。x 是检查内存的命令。/i 是以指令格式来格式化;/x 将以 16 进制格式来格式化;而 /a 将以 16 进制来格式化。然而,您应该在尽可能的地方把该值看作是地址,并解析符号名称。


display /i $pswa
display /x $pswm
display /a $r0
display /a $r1
display /a $r2
display /a $r3
display /a $r4
display /a $r5
display /a $r6
display /a $r7
display /a $r8
display /a $r9
display /a $r10
display /a $r11
display /a $r12
display /a $r13
display /a $r12
display /a $r14
display /a $r15
display /10i $pswa

图 6

  当在指令级工作时,设置一些显示可能是有所帮助的。您可以将所有 display 命令放在一个文件中,并在命令行上使用 -x 选项来指定它。图 6 包含了工作在汇编程序级时通常使用的 display 命令。


Breakpoint 1, main () at simple.c:27
27 {
20: x/10i $pswa
0x80000794 : EB AF F0 50 00 24 stmg %r10,%r15,80(%r15)
0x8000079a : B9 04 00 1F lgr %r1,%r15
0x8000079e : A7 FB FF 58 aghi %r15,-168
0x800007a2 : E3 10 F0 00 00 24 stg %r1,0(%r15)
0x800007a8 : 41 C0 F0 A0 la %r12,160(%r15)
0x800007ac : C0 10 00 00 08 C2 larl %r1,0x80001930
0x800007b2 : E3 10 F0 A0 00 24 stg %r1,160(%r15)
0x800007b8 : B9 04 00 2C lgr %r2,%r12
0x800007bc : C0 E5 FF FF FF 68 brasl %r14,0x8000068c
0x800007c2 : E3 10 F0 A0 00 04 lg %r1,160(%r15)
19: /a $r15 = 0x1fffffff698
18: /a $r14 = 0x10000057b04 <__libc_start_main+260>
17: /a $r12 = 0x10000019108 <__curbrk+280>
16: /a $r13 = 0x8006c9be
15: /a $r12 = 0x10000019108 <__curbrk+280>
14: /a $r11 = 0x1fffffff7f8
13: /a $r10 = 0x80000418 <_init>
12: /a $r9 = 0x100000198f8 <_dl_debug_mask>
11: /a $r8 = 0x1000017bee0
10: /a $r7 = 0x1
9: /a $r6 = 0x2
8: /a $r5 = 0x100001803d8
7: /a $r4 = 0x1fffffff808
6: /a $r3 = 0x1fffffff7f8
5: /a $r2 = 0x1
4: /a $r1 = 0x80000794
3: /a $r0 = 0x1ff00000000
2: /x $pswm = 0x705c00180000000
1: x/i $pswa 0x80000794 : EB AF F0 50 00 24 stmg %r10,%r15,80(%r15)
(gdb)

图 7

  这个命令打印全部 PSW 值、所有通用寄存器和从当前指令地址开始的下 10 行机器代码。图 7 显示了当我们在 main() 处中断时的结果。可以看到,在其中一些寄存器所指向的地方,/a 格式解析是如何使得理解正在发生的事情更加容易的。

结束语

  对于一些可用于 Linux 应用程序调试的基本工具以及调试过程本身,本文中的信息应该为您提供了有用的入门信息。
使用GDB进行代码覆盖率测试(zt) http://www.ibm.com/developerworks/cn/linux/l-cn-gdb/index.html级别: 中级刘 明 (ovis_poly@sina.com), 软件工程师, 上海交通大学电子与通信工程系2007 年 11 月 22 日测试工程师经常面对的一个问题就是如何获得测试的代码覆盖率。很多专业软件可以提供这种专门的代码覆盖率检测。通过对 GDB 阅读详情

相关推荐

基于多时间尺度的电动汽车光伏充电站联合分层优化调度(Matlab代码实现)

该研究提出了一种电动汽车光伏充电站的分层优化调度方法,采用日前-日内两阶段协同优化框架。日前阶段通过混合整数规划对多充电站进行全局优化,以平抑电网波动和降低购电成本为目标;日内阶段基于实时数据,采用NSGA-II等算法动态分配充电功率。该方法实现了光伏高效消纳、成本节约和电网负荷平衡的有效统一。

zhangxd212489的博客 520

gdb设置断点出现Cannot access memory at address的错误

文章目录1.0 问题描述1.1 问题复现2.02.1 静态链接库2.2 动态链接库2.3 PIC 1.0 问题描述 今天在给一个可执行c程序的entry point address设置断点的时候,出现了Cannot access memory at address的错误(为了测试为什么gcc -e指定一个函数foo先运行的时候,foo函数用return会出现core dump的错误,这个后面将),在谷歌上搜索了半天终于弄明白咋回事,看看我的操作步骤 1.1 问题复现 我有以下的C代码 #include &l

qq_37026934的博客 4万+

aubo i5 + realsense D435i识别抓取实践二

aubo i5 + realsense D435i识别抓取实践二前言一、手眼标定是什么?二、标定软件安装1.aruco_ros安装2.vision_visp安装3.easy_handeye安装4.realsense驱动安装5.安装realsense ROS软件包三、配置1.launch文件修改2.打印二维码四、手眼标定1.启动launch文件2.标定步骤3.发布tf关系 前言 前面配置好了aubo机械臂的ROS软件包,机械臂可以正常运行后,接下来我们进行机械臂与相机的手眼标定。手眼标定分为eye_on_ha

转角 6375

gdb (GNU 调试器):基础

就调试本机可执行文件(即不是 Java* 或 perl 等)而言,使用 gdb 就对了。gdb 可用于源代码级调试,以及跟踪没有源代码的程序或检查某个终止的程序留下的核心文件。遗憾的是,当您从来没有使用过它,或者已经有一段时间没有使用它时,使用它来做这些工作可能很困难。图 1 展示了使用 gdb 来进行调试所需的每个命令。Command Descriptionfile load programb

2523

基于Quartus II软件的FPGA综合实验——多功能数字钟

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、设计要求二、设计原理三、设计过程1.数码管扫描模块2.计时模块3.闹钟模块4.闹钟响铃模块5.数码管显示模块6.整点报时功能7.模式选择模块(计时器主控电路)四、实验中遇到的困难及解决方案五、总结 前言 FPGA综合实验——多功能数字钟 基于Quartus II软件 一、设计要求 设计一个能进行时、分、秒计时的十二小时制或二十四小时制的数字钟,并具有定时与闹钟功能,能在设定的时间发出闹铃音,能非常方便地对小时、分钟和秒进.

qq_53022342的博客 2万+

杰理芯片外挂Flash音乐播放功能避坑指南(附FAT文件系统配置)

本文详细解析了杰理芯片外挂Flash实现音乐播放功能的技术要点与常见问题,包括硬件连接、SPI驱动配置、FAT文件系统烧录及音乐播放集成等关键环节。特别针对Flash选型、FAT文件系统配置等易错点提供实用解决方案,帮助开发者高效完成嵌入式音频系统开发。

yhn45678901的博客 833

linux c++ 程序运行core,gdb调试显示cannot access memory at address

如题,在linux环境写的c++程序,运行时core了,gdb调试core文件显示:cannot access memory at address 参考了:GDB调试,遭遇“cannot access memory at address” 有可能是你的程序或者你引用的库是32位,而你所使用的机器是64位的,如果是这样,那么你不能使用gdb,而应该使用gdb.32命令来进行调试。 怀疑是...

guangyacyb的博客 1万+

海康读码器上位机开发避坑指南:IDMVS客户端之外,如何用C# SDK搞定扫码、数据比对与实时控制?

本文详细介绍了如何利用海康读码器的C# SDK进行二次开发,实现从基础扫码到复杂工业控制的全流程解决方案。内容涵盖SDK架构解析、多设备管理系统构建、业务逻辑与设备控制实现,以及系统集成与性能优化等关键环节,为工业自动化领域的开发者提供实用指南。

weixin_30642561的博客 550

用GDB调试程序(ZT)

用GDB调试程序 GDB概述 ———— GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。 一般来说,GDB主要帮忙你完成下面四个方面的功能:   

smilewinds 588

sysrepo 开发者指南(一个基于libyang与支持rpc的数据库)

sysrepo 开发者指南(一个基于libyang与支持rpc的数据库) 日志记录 默认情况下,所有 Sysrepo 日志记录都处于关闭状态。如果启用,日志消息有 3 种输出。它们可以写入stderr、由 处理syslog或简单地传递给回调。 请务必注意,启用 Sysrepo 日志记录也会修改libyang日志记录设置。错误消息被视为标准 Sysrepo 错误,其他严重性较低的消息完全隐藏。要更改此行为,只需在启用 Sysrepo 日志记录后调整libyang日志记录设置。 此外,几乎每个 Sysrepo

weixin_43489394的博客 9229

别再死记硬背窗函数公式了!用MATLAB实战汉宁窗FIR滤波器,从频谱图看懂‘主瓣’和‘旁瓣’

本文通过MATLAB实战演示汉宁窗FIR滤波器的设计过程,帮助读者从频谱图直观理解主瓣与旁瓣的特性。文章详细对比了矩形窗与汉宁窗的频谱差异,并提供了高通滤波器设计的完整代码示例,适用于数字信号处理学习和工程应用。

weixin_30555125的博客 490

GDB基本用法zt

    当程序出错并产生core 时     快速定位出错函数的办法     gdb 程序名 core文件名(一般是core,也可能是core.xxxx)          调试程序使用的键       r   run 运行.程序还没有运行前使用       c   cuntinue  继续运行。运行中断后继续运行       q   退出       kill 终止调试的程序       h  

蜗牛档案室 2723

STM32实战开发(128):智能位移检测 - 使用STM32实现位移检测

STM32作为一款功能强大的微控制器,由于其出色的处理能力、丰富的外设接口和低功耗特点,成为实现智能位移检测系统的理想选择。未来,可以通过结合更多传感器、多种数据处理算法以及云平台技术,进一步提升系统的智能化水平,优化位移测量的精度和稳定性。本篇博客将介绍如何使用STM32微控制器实现智能位移检测系统,涉及硬件设计、传感器选择、软件开发等多个方面,提供详细的设计步骤,并给出完整的代码示例,帮助开发者快速搭建智能位移检测系统。蜂鸣器连接到STM32的GPIO端口,当位移超过设定的阈值时,蜂鸣器发出警报。

2201_76125393的博客 901

linux gdb 远程调试,GDB 远程调试试验(gdbserver)【ZT】

一.基本原理调试器是运行在host pc机的应用程序, 被调试的程序是运行在target上。插桩(stub):在目标操作系统和调试器内分别加入某些功能模块,二者互通信息来进行调试。调试器与被调程序的通信:Gdb和调试stub通过GDB串行协议进行通信。指定通信端口(串口 并口 网卡)遵循远程调试协议进行通信。GDB串行协议是一种基于消息的ASCII码协议,包含了诸如读写内存、查询寄存器、运行程序等...

weixin_29168813的博客 833

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

GDB 远程调试试验(gdbserver)【ZT】

一.基本原理 调试器是运行在host pc机的应用程序, 被调试的程序是运行在target上。 插桩(stub):在目标操作系统和调试器内分别加入某些功能模块,二者互通信息来进行调试。 调试器与被调程序的通信:  Gdb和调试stub通过GDB串行协议进行通信。指定通信端口(串口 并口 网卡)遵循远程调试协议进行通信。GDB串行协议是一种基于消息的ASCII码协...

张继飞的专栏 681

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

大家一起用gtk编程4(使用GDB调试程序)[zt]

大家一起用gtk编程4(使用GDB调试程序)转载请注明出处:http://lvjinhua.cublog.cn作者:lvjinhua at gmail dot com2006.09.23 6、使用GDB调试程序上回话说使用Makefile来组织源代码,这回简单地介绍下如何使用GDB来调试我们的程序;关于GDB的其它应用将在后续的章节中逐渐深入。首 先需要肯定一点,GDB...

weixin_33672400的博客 182

lwip-2.0.3

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

用GDB调试程序(zt)

http://www.linuxsir.org/bbs/showthread.php?t=171156

Technology+Communication+Fashion 697

【zt】core文件的简单介绍

//--------------------------------------------------------------- 1. core文件的简单介绍 //--------------------------------------------------------------- 在一个程序崩溃时,它一般会在指定目录下生成一个core文件。core文件仅仅是一个内存映象(同时加上调试信

茂森的专栏 818

OpenSBI调试技巧:使用GDB追踪RISC-V固件执行流程

OpenSBI作为RISC-V架构的开源监督者二进制接口实现,在固件开发过程中调试是必不可少的环节。本文将详细介绍如何使用GDB(GNU调试器)追踪OpenSBI固件的执行流程,帮助开发者快速定位问题并优化代码。 ## 📋 调试环境准备 在开始调试前,需要确保系统中已安装RISC-V架构的GDB工具链。通常可以通过包管理器安装`riscv64-unknown-elf-gdb`,或从源码编译最

gitblog_00438的博客 480

硬盘上的一些算法小题目||and今天看了下林锐的书以及gdb调试 及一些变成算法小题目...

gdb调试:观察点,断点,事件捕捉点。step 进入函数,next 跳过函数,until 跳出循环,finish 结束函数 林锐:书后试题 & c++的对象模型图 看了二叉树的非递归遍历, 链表的操作, ZT 设计模式六大原则(1):单一职责原则 ZT 设计模式六大原则(2):里氏替换原则所有引用基类的地方必须能透明地使用其子类的对象 ...

weixin_30551947的博客 109

Linux下C语言编程(ZT)

文章来源:网络 Linux的发行版中包含了很多软件开发工具。 它们中的很多是用于 C 和 C++应用程序开发的。 本文介绍了在 Linux 下能用于 C 应用程序开发和调试的工具。 本文的主旨是介绍如何在 Linux 下使用 C 编译器和其他 C 编程工具, 而非 C 语言编程的教程。 在本文中你将学到以下知识: · 什么是 C · GNU C 编译器 · 用 gdb 来调试GCC应用程序

1151

How to use C programing language in Linux as a expert[ZT]

Linux的发行版中包含了很多软件开发工具。 它们中的很多是用于 C 和 C++应用程序开发的。 本文介绍了在 Linux 下能用于 C 应用程序开发和调试的工具。 本文的主旨是介绍如何在 Linux 下使用 C 编译器和其他 C 编程工具, 而非 C 语言编程的教程。 在本文中你将学到以下知识:   · 什么是 C  · GNU C 编译器  · 用 gdb 来调试GCC应用程序  你也能看到随

秋风秋雨斋 3246

Debian系列-系统安装及Qt基础开发环境配置

又要开新坑了,由于某些原因,不得不高Linux了,这次我要对*Debian*下手了,所以今天第一篇就是关于**Debian**的安装,**Qt**环境安装,以及**Git**安装三部分。

DreamLife&Yaothos 3656
上一篇: Gcc使用的内嵌汇编语法格式小教程zt
下一篇: GDB基本用法zt
snaill
博客等级 码龄27年 599粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值