gdbserver 远程调试问题:设置文件和so搜索路径

编写一个必然crash 的程序

#include <stdio.h>

void crash(){

    char *a=0;
    *a=0;
}
int main()
 {
        printf("hello world\n");
        crash();
        printf("after crash\n");
 }

执行gdb 远程调试

gdbserver :1234 a.out

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

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

(gdb) c
Continuing.

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400534 in ?? ()
(gdb) bt
#0  0x0000000000400534 in ?? ()
#1  0x00007fffffffe4c0 in ?? ()
#2  0x000000000040054c in ?? ()
#3  0x0000000000000000 in ?? ()
(gdb) file /home/payne/hello/a.out
A program is being debugged already.
Are you sure you want to change the file? (y or n) y
Reading symbols from /home/payne/hello/a.out...done.
(gdb) bt
#0  0x0000000000400534 in fun1 () at hello.cpp:6
#1  0x000000000040054c in main () at hello.cpp:12

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

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400534 in crash() ()
(gdb) bt
#0  0x0000000000400534 in crash() ()
#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 中的函数

rogram received signal SIGSEGV, Segmentation fault.
0x00007ffff7ff65bc in ?? ()
(gdb) bt
#0  0x00007ffff7ff65bc in ?? ()
#1  0x00007fffffffe470 in ?? ()
#2  0x0000000000400657 in ?? ()
#3  0x0000000000000000 in ?? ()
(gdb) file /home/payne/hello/a.out
A program is being debugged already.
Are you sure you want to change the file? (y or n)
Please answer y or n.
A program is being debugged already.
Are you sure you want to change the file? (y or n) y
Reading symbols from /home/payne/hello/a.out...(no debugging symbols found)...done.
(gdb) bty
Undefined command: "bty".  Try "help".
(gdb) bt
#0  0x00007ffff7ff65bc in ?? ()
#1  0x00007fffffffe470 in ?? ()
#2  0x0000000000400657 in main ()

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

(gdb) set solib-search-path /home/payne/hello
Reading symbols from /home/payne/hello/libcrash.so...(no debugging symbols found)...done.
Loaded symbols for /home/payne/hello/libcrash.so
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.
done.
Loaded symbols for /lib/x86_64-linux-gnu/libc.so.6
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.
done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
(gdb) bt
#0  0x00007ffff7ff65bc in crash() () from /home/payne/hello/libcrash.so
#1  0x0000000000400657 in main ()

gdbserver 远程调试问题:设置文件和so搜索路径

时间: 2024-10-19 14:03:14

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

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

此处所讲的是基于gdb和gdbsever的远程调试方法.环境为:PC机:win7.虚拟机:10.04.下位机:飞嵌TE2440开发板. 嵌入式linux应用程序的开发一般都是在linux里面编写好代码,并用交叉编译器arm-linux-gcc编译好之后再下载到板子上运行.如果建立了远程调试(能够在PC机ubuntu中调试板子中的linux应用程序),这样对于开发程序是极其方便的. 以下是摘自网络上的一些方法.其中加入了自己所遇到的一些问题,并提出了解决方法. 1.首先建立nfs文件系统,让PC机

GDB + gdbserver 远程调试android native code

原文地址:GDB + gdbserver 远程调试android native code 作者:tq08g2z 以调试模拟器中的native library code为例. Host: ubuntuTarget: Android ICS 1.将gdbserver放入设备. 确保系统有arm-*-gdb,及存在设备端将要运行的gdbserver,gdbserver可以由google ndk中获取,在ndk的如下目录可以找到这个文件: 点击(此处)折叠或打开 android-ndk-r8/toolc

使用gdbserver远程调试

转载:http://my.oschina.net/shelllife/blog/167914 gdbserver工具 先确定默认crosstool交叉编译器是否有自带gdbserver,如果有就不需要自行编译.一般都会带有对应的gdbserver工具,可以通过find命令查找确定: [email protected]:~/work/system$ which arm-none-linux-gnueabi-gcc /opt/arm-2009q3/bin/arm-none-linux-gnueabi

断点调试 WebUploader获取文件上传成功路径问题

WebUploader获取文件上传成功路径问题 最近在使用WebUploader的时候,上传文件成功,但是怎么也获取不到返回的图片文件成功路径,上传成功后,返回文件代码如下: uploader.on('uploadSuccess', function (file, response) { var imgurl = response.url; //上传图片的路径 alert(imgurl);}); 之后看一下浏览器调试结果: 可以看到imgurl=undefined,但同时response _ra

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

??对于自定义的LaTeX宏包与类,在调用时可以通过在命令\documentclass{}与\usepackage{}命令中指定完整路径或者相对路径,这样确实可以调用,但是编译时总是有烦人的警告信息,让人不爽.还好有一个办法可以解决. ? 操作系统:Ubuntu 16.04 64位桌面版 LaTeX工具:TeXstudio 2.10.8 ? 1.打开终端,输入以下命令 kpsewhich -var-value=TEXMFHOME ??这个命令会查询到默认的宏包与类搜索路径,我的电脑上显示结果为:

动态库,头文件,命令搜索路径

Linux操作系统上面的动态共享库大致分为三类: 1.操作系统级别的共享库和基础的系统工具库 比方说libc.so, libz.so, libpthread.so等等,这些系统库会被放在/lib和/usr/lib目录下面,如果是64位操作系统,还会有/lib64和/usr /lib64目录.如果操作系统带有图形界面,那么还会有/usr/X11R6/lib目录,如果是64位操作系统,还有/usr/X11R6 /lib64目录.此外还可能有其他特定Linux版本的系统库目录.这些系统库文件的完整和版

Eclispe远程调试tomcat设置

首先在catelina.sh中添加 JAVA_OPTS="$JAVA_OPTS -Xrunjdwp:transport=dt_socket,address=23787,server=y,suspend=n" Eclipse中debug configuration中,connect 标签下设置端口号和source标签下设置对应工程 在java源文件中设置断点 重启tomcat服务器,当执行到设置的断点时,Eclipse会自动跳转到断点处

PHP中使用set_include_path动态设置文件加载扫描路径

/index.php/include/config.php 下面是index.php <?php  $path = '/usr/lib/pear';  set_include_path(get_include_path() . PATH_SEPARATOR . $path); //设置后的include_path变为类似/usr/lib/function;/usr/lib/pear  include("config.php"); //先搜索当前目录->搜索get_inclu

PHP使用Xdebug进行远程调试

PHP使用Xdebug进行远程调试 翻译 by mylxsw posted on 2014/07/14 under 技术文章 > 编程语言 Xdebug提供了客户端与PHP脚本进行交互的接口,这一章将会介绍如何让PHP和Xdebug开启这个特性,并且介绍一些常用的客户端. 概述 Xdebug(远程)调试器允许测试数据结构,步进并且调试你的代码.Xdebug提供了两种协议用于与其进行交互:在Xdebug1.3和2中旧的GDB协议和Xdebug2中实现的DBGp协议. 客户端 Xdebug2 为DB