编写一个必定crash 的程序

  1. #include <stdio.h>
  2.  
  3. void crash(){
  4.  
  5. char *a=0;
  6. *a=0;
  7. }
  8. int main()
  9. {
  10. printf("hello world\n");
  11. crash();
  12. printf("after crash\n");
  13. }

运行gdb 远程调试

gdbserver :1234 a.out

执行 gdb , 执行命令  target remote :1234

必须用 file 指定可运行文件,才干看见调用函数

  1. (gdb) c
  2. Continuing.
  3.  
  4. Program received signal SIGSEGV, Segmentation fault.
  5. 0x0000000000400534 in ?? ()
  6. (gdb) bt
  7. #0 0x0000000000400534 in ??
  8.  
  9. ()
  10. #1 0x00007fffffffe4c0 in ?? ()
  11. #2 0x000000000040054c in ?
  12.  
  13. ? ()
  14. #3 0x0000000000000000 in ??
  15.  
  16. ()
  17. (gdb) file /home/payne/hello/a.out
  18. A program is being debugged already.
  19. Are you sure you want to change the file? (y or n) y
  20. Reading symbols from /home/payne/hello/a.out...done.
  21. (gdb) bt
  22. #0 0x0000000000400534 in fun1 () at hello.cpp:6
  23. #1 0x000000000040054c in main () at hello.cpp:12

不用 -g 编译也能看见函数,但不能定位到行

  1. Program received signal SIGSEGV, Segmentation fault.
  2. 0x0000000000400534 in crash() ()
  3. (gdb) bt
  4. #0 0x0000000000400534 in crash() ()
  5. #1 0x000000000040054c in main ()

把 crash 放到 so 中会怎样?

生成libcrash.so 又一次编译 hello.cpp

g++ -o libcrash.so -shared crash.cpp

export LD_LIBRARY_PATH=`pwd`

g++  hello.cpp  -lcrash

gdb 不能定位到 so 中的函数

  1. rogram received signal SIGSEGV, Segmentation fault.
  2. 0x00007ffff7ff65bc in ?
  3.  
  4. ?
  5.  
  6. ()
  7. (gdb) bt
  8. #0 0x00007ffff7ff65bc in ?? ()
  9. #1 0x00007fffffffe470 in ?? ()
  10. #2 0x0000000000400657 in ?? ()
  11. #3 0x0000000000000000 in ?? ()
  12. (gdb) file /home/payne/hello/a.out
  13. A program is being debugged already.
  14. Are you sure you want to change the file? (y or n)
  15. Please answer y or n.
  16. A program is being debugged already.
  17. Are you sure you want to change the file? (y or n) y
  18. Reading symbols from /home/payne/hello/a.out...(no debugging symbols found)...done.
  19. (gdb) bty
  20. Undefined command: "bty". Try "help".
  21. (gdb) bt
  22. #0 0x00007ffff7ff65bc in ??
  23.  
  24. ()
  25. #1 0x00007fffffffe470 in ?? ()
  26. #2 0x0000000000400657 in main ()

用 set solib-search-path 指定路径, 能够得到 so 中的位置

  1. (gdb) set solib-search-path /home/payne/hello
  2. Reading symbols from /home/payne/hello/libcrash.so...(no debugging symbols found)...done.
  3. Loaded symbols for /home/payne/hello/libcrash.so
  4. Reading symbols from /lib/x86_64-linux-gnu/libc.so.6...Reading symbols from /usr/lib/debug/lib/x86_64-linux-gnu/libc-2.15.so...done.
  5. done.
  6. Loaded symbols for /lib/x86_64-linux-gnu/libc.so.6
  7. Reading symbols from /lib64/ld-linux-x86-64.so.2...Reading symbols from /usr/lib/debug/lib/x86_64-linux-gnu/ld-2.15.so...done.
  8. done.
  9. Loaded symbols for /lib64/ld-linux-x86-64.so.2
  10. (gdb) bt
  11. #0 0x00007ffff7ff65bc in crash() () from /home/payne/hello/libcrash.so
  12. #1 0x0000000000400657 in main ()

gdbserver 远程调试问题:设置文件和so搜索路径的更多相关文章

  1. GDB + gdbserver 远程调试android native code

    原文地址:GDB + gdbserver 远程调试android native code 作者:tq08g2z 以调试模拟器中的native library code为例. Host: ubuntuT ...

  2. 使用gdbserver远程调试

    使用gdbserver远程调试   1.默认crosstool交叉编译器没有自带gdbserver,需要自行编译 到GNU官方FTP下载,目前最新版的是gdb-6.7.1下载地址:http://ftp ...

  3. gdbserver远程调试嵌入式linux应用程序方法

    此处所讲的是基于gdb和gdbsever的远程调试方法.环境为:PC机:win7.虚拟机:10.04.下位机:飞嵌TE2440开发板. 嵌入式linux应用程序的开发一般都是在linux里面编写好代码 ...

  4. Makefile一 头文件及库搜索路径

    头文件及库搜索路径 头文件的搜索路径: 头文件的搜索规则是:找到就使用,停止继续往下寻找 1: #include “mytest.h” 搜索的顺序为: (1)先搜索当前目录 (2)然后搜索编译时 -I ...

  5. GDB + gdbserver 远程调试mediaserver进程

    远程调试步骤 在Android设备上启动gdbserver并attach你想调试的进程,并指定监听调试命令的端口(此端口是TV上的端口) $ adb shell # ps |grep media  # ...

  6. LaTeX自定义宏包、类文件的默认搜索路径设置方法

      对于自定义的LaTeX宏包与类,在调用时可以通过在命令\documentclass{}与\usepackage{}命令中指定完整路径或者相对路径,这样确实可以调用,但是编译时总是有烦人的警告信息, ...

  7. 如何在sublime3项目设置中设置python模块的搜索路径?ImportError: No module named *的解决办法

    问题:之前使用pycharm,用的挺溜,但是电脑配置实在不争气,pycharm启动久了,耗去大量内存,导致运行起来越来越慢,于是转向使用sublime text. 把项目从pycharm切换到subl ...

  8. Eclispe远程调试tomcat设置

    首先在catelina.sh中添加 JAVA_OPTS="$JAVA_OPTS -Xrunjdwp:transport=dt_socket,address=23787,server=y,su ...

  9. hive,spark的远程调试设置

    spark的远程调试 spark-env.sh文件里面,加上下面配置即可: if [ "$DEBUG_MODE" = "true" ]; then export ...

随机推荐

  1. Koa 中实现 chunked 数据传输

    有关于 Transfer-Encoding:chunked 类型的响应,参见之前的文章HTTP 响应的分块传输.这里看 Koa 中如何实现. Koa 中请求返回的处理 虽然官方文档有描述说明不建议直接 ...

  2. 3.ThinkPHP入门---视图

    视图:MVC三大组成部分,负责信息的展示和输出 1.视图的创建 创建的位置需要是在分组目录下的view目录下余控制器同名的目录中. 2.视图的展示 在smarty和tinkphp都是使用diaplay ...

  3. angular实现的tab栏切换

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Ubuntu14.04引导菜单修复

    原文链接:http://www.metsky.com/archives/636.html 独立分区下的Ubuntu引导菜单修复有点麻烦,执行挂载等命令时要小心检查,修复此类引导,首先需要确保当前系统和 ...

  5. 解决strip: Unable to recognise the format of the input file问题

    前言   在编译xilinx的uboot的时候出现了一个问题,始终报错:“strip: Unable to recognise the format of the input file `gen_et ...

  6. .apply和.call用法和区别

    apply:方法能劫持另外一个对象的方法,继承另外一个对象的属性. Function.apply(obj,args)方法能接收两个参数obj:这个对象将代替Function类里this对象args:这 ...

  7. Nginx部署静态资源(及root与alias区别)

    root目录与alias目录的区别Nginx路径location配置中,使用root目录与alias目录的区别 1)alias指定的目录是准确的,即location匹配访问的path目录下的文件直接是 ...

  8. hibernate注解--@transient

    @transient:表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性. 如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Bas ...

  9. google spanner

    REF 论文 google spanner spanner 介绍 http://blog.jobbole.com/110262/

  10. N3-2 - 树 - binary-tree-level-order-traversal-ii

    题目描述: Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, fro ...