首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

调试C: GDB返回“已加载<file>的地址缺失”

是指在使用GDB调试C程序时,出现了一个已加载文件的地址缺失的错误。

这个错误通常是由于以下几种情况引起的:

  1. 编译器优化:编译器在优化代码时可能会对变量进行一些优化,导致在调试时无法获取到变量的准确地址。可以尝试关闭编译器的优化选项,如使用gcc编译时加上-O0参数。
  2. 编译选项:在编译时可能没有加上调试信息的选项,导致GDB无法获取到变量的地址。可以尝试在编译时加上-g选项,如使用gcc编译时加上-g参数。
  3. 调试信息不匹配:如果编译和调试的代码不匹配,可能会导致GDB无法正确获取变量的地址。可以尝试重新编译和调试代码,确保代码版本一致。

解决这个问题的方法有:

  1. 确保编译时加上了调试信息的选项,如-g选项。
  2. 确保编译和调试的代码版本一致,避免出现调试信息不匹配的情况。
  3. 尝试关闭编译器的优化选项,如使用-O0参数。
  4. 可以尝试使用其他调试工具,如LLDB等。

关于GDB的更多信息和使用方法,可以参考腾讯云提供的GDB产品文档:GDB产品介绍

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

GDB那些奇淫技巧

这是一个 gdb 命令,其目的是告诉 gdb 在目标应用调用fork之后接着调试子进程而不是父进程,因为在 Linux 中fork系统调用成功会返回两次,一次在父进程,一次在子进程。...如果标准输入是文件,那很简单: $ gdb demo (gdb) run <file 但更多时候为了方便调试,希望能以其他程序输出来运行,比如: $ python -c 'print "A"*100'...gdb object pid 对正在执行进程进行调试 gdb 正常启动,启动后需要 file 命令手动加载 gdb -tui 启用 gdb 文本界面(或 ctrl-x ctrl-a 更换 CLI...命令 含义 备注 file {object} 加载可执行文件供调试 file 放弃可执行和符号表信息 symbol-file {object} 仅加载符号表 exec-file {object...} 指定用于调试可执行文件(非符号表) core-file {core} 加载 core 用于分析 信号控制 命令 含义 备注 info signals 打印信号设置 handle {signo

1.2K20

二进制学习

类型 修改返回地址,让其指向溢出数据中一段指令(shellcode) 修改返回地址,让其指向内存中已有的某个函数(return2libc) 修改返回地址,让其指向内存中已有的一段指令(ROP) 修改某个被调用函数地址...当然为了方便大家查阅,这里直接给出汇总表格附录: 启动 GDB 命令 含义 备注 gdb object 正常启动,加载可执行 gdb object core 对可执行 + core 文件进行调试...gdb object pid 对正在执行进程进行调试 gdb 正常启动,启动后需要 file 命令手动加载 gdb -tui 启用 gdb 文本界面(或 ctrl-x ctrl-a 更换 CLI...命令 含义 备注 file {object} 加载可执行文件供调试 file 放弃可执行和符号表信息 symbol-file {object} 仅加载符号表 exec-file {object...} 指定用于调试可执行文件(非符号表) core-file {core} 加载 core 用于分析 信号控制 命令 含义 备注 info signals 打印信号设置 handle {signo

1K20
  • GDB调试学习

    gdb调试 能进行GDB调试,一般在编译过程中,需使用-g参数。如果不使用-g参数,则在gdb调试过程中,将不能得到程序函数名、变量名等信息,而只能看见运行时内存地址。...主要用于汇编调试 b * // 停在代码某个地址处 d // 删除断点 info b // 查看断点 r:运行被调试程序。...cd dir:运行GDB,使用dir作为gdb工作目录。 se File:从File读取符号表并把它作为可执行文件。 -write:开通enable往可执行文件和核心文件写权限。...Ctrl + c:在当前位置停止执行正在执行程序,断点在当前行。 ptype:显示变量类型 return:强制从当前函数返回。 whatis:显示变量值和类型。...xbreak:在当前函数退出点上设置一个断点。 load:动态加载一个可执行文件到调试器。 ignore:忽略某个断点指定次数。 finish:继续执行,直到当前函数返回

    1.4K20

    GDB使用详解

    一、打开GDB 1、gdb filename 加载该文件到gdb 2、gdb file filename 如果gdb filename失败,可以在打开gdb以后,通过file加载调试文件 3、gdb...-tui file filename 带画面的调试 ?...*注意-g,在linux下用gcc编译时,如果不加-g,编译器会进行优化,就不会生成调试信息,无法调试,也可以使用-ggdb,这是gcc为gdb提供更详细调试信息,别的调试器无法使用。...r (run):执行程序; s(step):有函数时,进入函数函数体,没有时,单步执行; n (next):单步执行,不进入函数体; c (continue):遇到断点以后,程序会阻塞,输入c可以让程序继续执行...until:可以运行程序直到退出循环体; finish:运行程序,直到当前函数完成返回,并打印函数返回堆栈地址返回值及参数值等信息; watch:设置一个监视点,一旦被监视“表达式”值改变,gdb

    6.8K100

    GDB更方便代码调试工具:CGDB

    作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++、嵌入式、Linux。 有 bug 示例代码 GDB 调试操作 CGDB 调试操作 别人经验,我们阶梯!...参数1: data[OUT]: 数据被加载缓冲区 参数2: len [OUT]:实际被加载数据长度 返回值: 0-成功,else-失败 */ static int get_data(unsigned...但是在一个项目中,如果不喜欢消除编译Warning警告的话,这个bug还是比较隐蔽。 编译测试代码:gcc -g test.c -o test 因为要使用GDB调试,所以别忘了加上-g选项。...) b 25 Breakpoint 1 at 0x400771: file test.c, line 25....当移动到25行时,如下: 按下空格键,表示在此行设置一个断点,此时行号变成红色: 并且在调试窗口打印一行信息: (gdb) Breakpoint 1 at 0x400771: file test.c

    1.6K30

    自己动手写一个GDB|基本功能

    根据官方文档介绍,GDB 支持调试以下语言编写应用程序: Ada Assembly C C++ D Fortran Go Objective-C OpenCL Modula-2 Pascal Rust...可以在调试程序时,打印程序信息。 下面主要围绕这三个功能进行阐述。 1. 调试可执行文件 我们使用 GDB 调试程序时,一般使用 GDB 直接加载程序可执行文件,如下命令: $ gdb ....然后子进程会调用 load_executable_file() 函数加载要进行调试程序,并且等待主进程发送调试命令。...第二步:加载调试程序 前面我们说过,子进程主要用于加载调试程序,并且等待调试进程(主进程)发送调试命令,现在我们来分析下 load_executable_file() 函数实现: void load_executable_file...* 2) 加载并且执行被调试程序可执行文件 */ execl(target_file, target_file, 0); } load_executable_file() 函数实现很简单,

    1.3K40

    MIT 6.828 操作系统工程 lab1 2018 fall part1 & part2 笔记 and 中文注释源代码阅读

    调试qemu: 打开新窗口: cd lab make qemu-gdb 在另外一个终端: make make gdb 开始使用gdb调试,首先进入实模式; IBM PC从物理地址0x000ffff0...当BIOS找到可引导软盘或硬盘时,它将512字节引导扇区加载到物理地址0x7c00至0x7dff内存中,然后使用jmp指令将CS:IP设置为0000:7c00,将控制权传递给引导程序装载机。...#include # 启动CPU:切换到32位保护模式,跳至C代码; # BIOS将该代码从硬盘第一个扇区加载到 # 物理地址为0x7c00内存,并开始以实模式执行 #...物理 # 地址线20绑在低电平,因此地址高于 # 1MB会被默认返回从零开始。...LMA 加载地址, obj/kern/kernel: file format elf32-i386 Sections: Idx Name Size VMA

    2K50

    跟踪分析Linux内核5.0系统调用处理过程

    驱动加载。...进行gdb调试 根据文件存放位置,在rootfs.img所在目录下开启两个终端分别执行如下命令。...# 建立gdb和gdbserver之间连接,按c 让qemu上Linux继续运行 (gdb)c #continue,跳到端点处 (gdb)s #step...在menuOS中输入sync,调用我们写好sync()函数,相应gdb 调试中进入了系统函数sys_sync()断点处,函数位于sync.c文件 123~375 行。...这时便进入内核态; 系统调用处理函数准备内核执行栈,并保存所有寄存器(一般用汇编语言实现); 系统调用处理函数根据系统调用号调用对应 C 函数——系统调用服务例程; 系统调用处理函数准备返回值并从内核栈中恢复寄存器

    1.4K20

    深入Android源码系列(一)

    本文讲解内容有 loadLibrary流程 linker ELF ndk开发以及配置调试版本 ndk-gdb --start调试so gdb 调试bin...我们调试linker代码,我们因为加载是__dl_android_dlopen_ext ,于是我们gdb下断点 b __dl_android_dlopen_ext ,这样子我们打断点,运行时候会在加载动态库时候...file XXX.so (有调试信息库,然后我们调试,就会变成有效信息) 05 关于gdb使用,可以参考 http://blog.csdn.net/ghostyu/article/details/...我们将bionic放置到我们调试ndk-gdb --start目录,再次调试,代码就检索出来了。...07 如何使用gdb调试android c可执行文件方案呢? 其中hello-jni是测试代码,操作如下: 可以看到调试结果如下: 调试成功。

    2.1K60

    gdb 调试笔记

    快照是对原先进程复制,所以地址相同,调试时候可以对地址下断点,而不用管随机化 (2)逆向执行 首先启动record 功能,就可以进行命令回溯 reverse‐continue 缩写rc reverse‐step...p/d 显示有符号十进制 p/u 显示无符号十进制 p/o 显示八进制 p/t 显示二进制 p/a 显示地址 p/c 显示符号 p/f 显示浮点数 p/r 以上一次格式显示 x/i 显示汇编 x...call func 执行func函数并打印返回值 return result 强制返回返回值为result 六、实用操作 gdb 重放操作 repeat (1)启动参数 gdb ‐n :可以不加载任何...command (3)转储分析 gdb ‐‐core= gdb program core gcore [file] 生成一个core文件用于保存当前gdb调试快照(默认生成core.pid...info symbol addr 查找地址对应symbol,如果找不到,会返回最近symbol+偏移 directory/dir dirname 设置符号表搜索路径 info program 显示程序状态

    89800

    GDB调试-从入门实践到原理

    在Linux环境软件开发中,GDB是主要调试工具,用来调试CC++程序(也支持go等其他语言)。...例如c++throw,或者加载时候,产生断点行为。...disassemble /mr function 同时比较函数源代码和汇编代码 调试和保存core文件 命令 含义 file exec_file *# * 加载可执行文件符号表信息 core core_file...加载core-dump文件 gcore core_file 生成core-dump文件,记录当前进程状态 启动方式 使用gdb调试,一般有以下几种启动方式: gdb filename: 调试可执行程序...gdb attach pid: 通过”绑定“进程ID来调试正在运行进程 gdb filename -c coredump_file: 调试可执行文件 在下面的几节中,将分别对上述几种调试方式进行讲解

    2.9K30

    【pwn-栈溢出】— ret2text

    0x10,也就是16字节 2.为了验证IDA帮我们分析出来这个偏移量是正确,我们决定用动态调试方法进行确定 图片 3.使用gdb加载程序,在0x4006B2处下一个断点 图片 4.可以输入context...2.运行exp1.py脚本,在gdb中下断点,并且输入c(continue)指令回车继续 图片 3.在exp1.py叫脚本窗口按回车继续,右边gdb就会断下来,可以看到当前堆栈返回地址已经覆盖成了...rbp,所以我们跳过这个地址,选择0x40068A这个地址作为返回地址执行 图片 0x8、修改脚本 1.修改后脚本 #!...分析是否有字符串/bin/sh,将它作为system参数 在此程序中,它直接提供一个后门函数,供我们使用 9.2、GDB调试指令 gdb -q:静默运行程序(不输出gdb启动时提示版本信息) b:下断点...c:继续运行 context:查看上下文信息(堆栈、寄存器、反汇编) quit:退出GDB 9.3、拓展 ctf-pwn-tips:里面总结了很多存在漏洞函数,以及输入参数描述,非常实用。

    1.4K81

    Linux内核0-使用QEMU和GDB调试Linux内核

    QEMU模拟器原生支持GDB调试器,这样可以很方便地使用GDB强大功能对操作系统进行调试,如设置断点;单步执行;查看调用栈、查看寄存器、查看内存、查看变量;修改变量改变执行流程等。...于是有了initramfs根文件系统,其中包含必要设备驱动和工具,boot loader加载initramfs到内存中,内核会将其挂载到根目录/,然后运行/init脚本,挂载真正磁盘根文件系统。...ppos=) at fs/seq_file.c:234 .........Linux把跟一个进程相关thread_info和内核栈stack放在了同一内存区域,内核通过esp寄存器获得当前CPU上运行进程内核栈栈底地址,该地址正好是thread_info地址,由于进程描述符指针...但是,按照上面进行操作后,进入gdb调试画面后,提示: To enable execution of this file add add-auto-load-safe-path /home/qemu2

    2.4K10

    ​Cisco Cook常用方法与技巧

    5.调试地址随机化问题: Cisco IOS固件在IDA解析中基址固定不变,但是某些型号设备其IOS加载地址随机变化,但是可以通过指令计算IOS加载偏移: 根据show region得出加载基址...,同IDA加载基址进行偏移计算,即可得出偏移量,然后对比IDA和实体设备gdb调试得到汇编代码,解决ASLR问题。...ROMMON在内存中加载地址一直不会变化,因此可以利用ROMMON中代码构造ROP攻击。整体流程可以分为以下三步: (1)首先利用栈溢出,劫持返回地址进入ROMMON部分,构造ROP链。...我们首先利用前面所讲方法解决调试ASLR防护,通过show region计算出动态与静态加载基址偏移量,解决地址随机化问题。...根据代码偏移量,在父函数返回地址处设置断点,查看返回地址覆盖情况,成功实现栈溢出攻击。 继续执行,路由器崩溃重启。

    1.7K10

    使用VMWare GDB和IDA调试Windows内核

    VMWareGDB调试器功能比较简单也比较基础,该调试器并不知道处理器和线程任何信息(对于Windows系统),因而如果想要得到一些高等级信息,我们需要自己做一些额外工作。...图08 此时将会中断在内核中地址大于0×80000000地方,现在就可以进行单步调试了,但是没有任何名称调试起来是非常不爽,那么我们就来收集更多信息让IDA显示看起来更加直观。...我们可以通过IDAFile->LoadFile->PDB file手动为每个模块加载符号库,但是这样做太蛋疼了。为什么不让它自动加载呢?...图09 如果Input file路径不对则需要手工进行修改,点击确定之后将会弹出如图10所示符号库加载确认窗口。...PDF版和插件下载地址:http://dl.dbank.com/c01rvue4ff 相关文章: IDA 6.1调试驱动 http://www.h4ck.org.cn/2011/05/windows-driver-debug-via-ida-pro

    1.5K30

    GDB实现原理和使用范例

    一、前言 这篇文章为了让你深入了解gdb工作原理,以及如何在linux环境下使用强大gdb调试程序功能。 二、gdb工作原理 2.1....(frame base) 为寄存器 rbp 值 AT_name 描述函数名字为 s_client_main AT_decl_file 说这个函数在 apps/s_client.c 文件中声明 AT_decl_line...说这个函数在 foo.c 第879(十六进制36F)行声明 AT_prototyped 为一个 Bool 值, 为 True 时代表这是一个子程序/函数(subroutine) AT_type 属性描述这个函数返回类型是什么...选择core文件 常用有: -c :使用-c指定core文件 -d 指定源代码路径 这里我比较少用到有,读者有兴趣可以继续做这个方面的调研 -s 读取符号文件 -e执行gdb命令 -readnow,立即加载所有的符号表,启动变慢,以后操作变快 -x:选择符号文件 3.3. gdb工作模式相关 -q 不输出基本信息和版权

    5.2K10

    GDB 调试工具使用方法详解

    next(n):单步跟踪,不进入函数,类似于VC中step out。 finish:运行程序,知道当前函数完成返回,并打印函数返回堆栈地址返回值及参数值等信息。...段错误是由于访问非法地址而产生错误。 访问系统数据区,尤其是往系统保护内存地址写数据。比如:访问地址为0地址。...6.3 gdb调试core文件 当设置完ulimit -c xxxx后,再次运行程序发生段错误,此时就会生成一个core文件,使用gdb core调试core文件,使用bt命令打印栈回溯信息...强大C/C++ 程序调试工具GDB  http://www.linuxidc.com/Linux/2016-09/135171.htm Linux GDB调试 详述 http://www.linuxidc.com...命令行调试调试C/C++程序 http://www.linuxidc.com/Linux/2014-11/109845.htm GDB调试命令总结  http://www.linuxidc.com

    1.5K20

    GDB调试

    GDB简介 GDB是GNU开原组织旗下一款强大代码调试工具,初始作者是大神Richard Stallman,GNU项目就是他发起,《Linux下C++程序员学习资料指南》中提到编辑器Emacs也是他杰作...编译时候加上-g参数,编译器就会在目标文件中添加调试信息(关于编译链接可参阅《从四个问题透析Linux下C++编译&链接》),对应strip命令可以去除调试信息。...回车在GDB相当于重复上一个命令。 启动GDB运行程序 运行GDB调试a.out程序有以下几种方式: 方式一:直接运行gdb,然后在gdb中执行“file a.out”加载程序。...next [count]:单步跟踪,跟step区别是碰到函数时不会进入函数,count效果同step中参数。 finish:运行程序直到函数完成,打印返回堆栈地址返回值及参数信息。...问题二:段错误 写CC++代码最常见问题是对内存不当处理,最常见莫过于段错误,典型的如访问不存在内存地址、访问了不允许访问地址(试图往只读位置写数据)。常见产生原因:1.

    2.2K10

    掌握GDB调试工具,轻松排除bug

    启动 gdb gdb test_file.exe 来启动 gdb 调试, 即直接指定需要调试可执行文件名 直接输入 gdb 启动,进入 gdb 之后采用命令 file test_file.exe 来指定文件名...finish:运行程序,知道当前函数完成返回,并打印函数返回堆栈地址返回值及参数值等信息。 until:当厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序知道退出循环体。...比如:内存地址非法访问。 逻辑错误:编译和运行都很顺利,但是程序没有干我们期望干的事情。 1.5gdb调试段错误 什么是段错误?段错误是由于访问非法地址而产生错误。...二、GDB常用命令 以下以 test_file.c 作为源程序例子名字,test_file.exe 作为可执行文件例子名字, 以param_1 作为参数例子名字。...Display 变量名 显示参数 file File 文件名(可以是绝对路径和相对路径) 加载文件 run Run args 运行程序 r 四、GDB实战 下面是一个使用了上述命令实战例子:

    69600
    领券