替换符号

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=208 自己看题吧,把'替换为’

#include <stdio.h>

#include <string.h>

#define N = 1000;

int main(){

 int i,j,cnt=0;  

char src[N],dst[N];  

while(gets(src)){

for(i=j=0;i<strlen(src);i++){    

if(src[i]!='"'){  

   dst[j++]=src[i];    }  

else {  

   cnt=(cnt+1)%2;  

   if(cnt){

     dst[j++]='`'; 

   dst[j++]='`';     }   

  else{      dst[j++]='\'';    

  dst[j++]='\'';         }  

  }   }   

dst[j]='\0';

  printf("%s\n",dst);  }

 return 0; }

转载于:https://www.cnblogs.com/sujunjie/archive/2013/02/28/2937558.html

<think>我们正在讨论GDB调试中替换符号表的问题。根据引用[3],我们知道在Linux系统中,导出的符号有特定的前缀(如__ksymtab_)。但是,用户的问题是关于在GDB调试时替换符号表。这可能涉及到动态修改调试过程中使用的符号信息。在GDB中,符号表通常由调试信息(例如ELF文件中的.debug_info节)提供。替换符号表可能意味着在调试时加载不同的符号信息,例如当原始符号表不完整或错误时,使用一个更完整的符号表。常见的场景是:1.调试时使用剥离了调试信息的二进制文件,但希望加载一个单独的调试信息文件(例如,.debug文件或符号表文件)。2.在调试内核模块时,需要加载与当前运行内核匹配的符号表。 GDB提供了加载额外符号文件的功能。通常,我们可以使用`add-symbol-file`命令来加载额外的符号表。这个命令需要指定符号表文件的路径以及加载的地址(对于动态加载的模块,如共享库或内核模块,其加载地址可能因每次运行而变化)。另外,GDB也支持使用`symbol-file`命令来替换主执行文件的符号表,或者使用`file`命令指定一个包含调试信息的文件。但是,用户的问题中提到了“替换符号表,可能是指替换已有的符号表,或者是在运行时动态替换。我们需要根据GDB的功能来回答。步骤:1.如果用户想要加载一个单独的符号文件(比如从编译时保留的调试信息),可以使用`symbol-file`命令来替换主执行文件的符号表,或者使用`add-symbol-file`来为动态加载的模块添加符号表。2.对于内核调试,可能需要使用`lx-symbols`(在GDB的Linux内核调试脚本中)来自动加载内核模块的符号表。具体操作:情况1:替换主执行文件的符号表-在GDB中,使用命令:`symbol-file文件名`,这将替换当前主执行文件的符号表。情况2:为共享库或内核模块添加符号表-首先,需要知道模块在内存中的加载地址(可以通过`infosharedlibrary`或内核调试中的`lsmod`等命令获取)。-然后,使用`add-symbol-file符号文件地址`命令加载。例如:`add-symbol-file /path/to/module.sym0x7ffff7de9000`情况3:自动加载符号表(针对内核调试)-在内核调试环境中,可以使用`lx-symbols`命令(需要先加载Linux内核提供的GDB脚本)。这个命令会自动加载当前内核和所有加载模块的符号表。另外,引用[4]提到了在.gdbinit中配置Python打印机,这虽然与符号替换不直接相关,但说明了GDB的初始化文件可以用于自动执行命令。因此,用户也可以在.gdbinit中添加`add-symbol-file`命令来自动加载符号表,但注意地址可能需要动态确定。注意事项: -替换或添加符号表时,必须确保符号表文件与正在调试的程序二进制文件匹配(同一编译版本),否则调试信息(如变量地址、行号)可能不准确,导致调试错误。如果用户没有现成的符号表文件,那么需要先获取。例如,在构建程序时,使用`-g`选项生成调试信息,并保存好生成的调试信息文件。对于已经剥离的程序,可以从调试包(如dbgsym包)中获取。因此,回答如下:</think>### GDB调试中替换符号表的方法 在GDB调试过程中替换符号表主要用于以下场景: 1. 调试优化后的代码时使用未优化版本的符号信息 2. 分析崩溃转储文件(core dump)时匹配不同版本的符号 3. 调试剥离符号的可执行文件时加载独立符号表 #### 操作方法: 1. **加载独立符号文件** 使用`symbol-file`命令加载包含调试信息的文件: ```gdb (gdb) symbol-file /path/to/debug_symbols ``` 适用于调试剥离符号的可执行文件(引用[3]中的`__ksymtab`前缀符号可由此加载)。 2. **动态添加模块符号** 对于共享库或内核模块,使用`add-symbol-file`并指定加载地址: ```gdb (gdb) add-symbol-file module.sym 0x4000d000 ``` 地址可通过`info proc mappings`或`info sharedlibrary`获取(引用[1]调试混合代码时常用)。 3. **自动加载配置** 在`~/.gdbinit`中配置自动加载规则(引用[4]示例): ```gdb set debug-file-directory /usr/lib/debug set solib-search-path /custom/lib/path ``` 4. **强制符号重载** 当符号地址偏移时需重新定位: ```gdb (gdb) set trust-readnow-sections on (gdb) file /path/to/binary (gdb) symbol-file # 重新加载符号 ``` #### 注意事项: 1. 符号文件必须与二进制文件**编译版本完全匹配** 2. 内核调试需确保`vmlinux`与运行内核版本一致(引用[3]) 3. 使用`readelf -S`验证符号文件的有效性 4. Windows混合调试需配置PDB路径(引用[1]) > 示例:调试崩溃转储 > ```gdb > $ gdb -c core.dump /path/to/binary > (gdb) symbol-file /path/to/matching_symbols > (gdb) bt full # 获取完整堆栈 > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值