QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8885|回复: 19

不好意思,还是关于gdbserver^_^!

[复制链接]
发表于 2004-6-16 23:36:16 | 显示全部楼层 |阅读模式
今天换了不同程序反复试了一下gdbserver,仿佛可以连接,但通信时都会出如下错误,
uclinux-skyeye端先启动
/bin> gdbserver host:1234 mytest
Process mytest created; pid = 19
code at 0x13a0040 - 0x13a5d00, data at 0x13a5d04

主机端
(gdb) target remote 10.0.0.2:1234
Remote debugging using 10.0.0.2:1234
Couldn't establish connection to remote target
Reply contains invalid hex digit 59
^^^^^^^^^^^^^^^^^^^^^

uclinux-skyeye端:
Remote debugging using host:1234
readchar: Got EOF
^^^^^^^^^^^^
Remote side has terminated connection.  GDBserver will reopen the connection.

上次斑竹大哥曾经告诉我在at91上uclinux on skyeye的gdbserver需要修改,从上面的错误,是否可以知道如何入手,不知道谁有没有经验可以介绍一下
 楼主| 发表于 2004-6-16 23:44:32 | 显示全部楼层
另外,我的虚拟网卡装好之后,
uclinux-skyeye上ping主机时,返回的时延几乎都是负值,

/> ifconfig eth0 up 10.0.0.2

/> route add -net 172.18.19.0 netmask 255.255.255.0 gw 10.0.0.1 eth0

/> ping 172.18.19.45

PING 172.18.19.45 (172.18.19.45):56 data bytes

64 bytes from 172.18.19.45: icmp_seq=0 ttl=64 time=0.-6 ms

64 bytes from 172.18.19.45: icmp_seq=1 ttl=64 time=0.-5 ms

64 bytes from 172.18.19.45: icmp_seq=2 ttl=64 time=0.-6 ms

64 bytes from 172.18.19.45: icmp_seq=3 ttl=64 time=0.-5 ms

还有从主机用能够tftp登陆,但之后根本传不了东西。
是不是我什么地方还没做对?
回复

使用道具 举报

发表于 2004-6-17 07:39:49 | 显示全部楼层
我的也是负值,不知道怎么回事呀
回复

使用道具 举报

 楼主| 发表于 2004-6-17 13:59:35 | 显示全部楼层
在gdbserver不能使用的情况下,如果要调试运行在uclinux on skeye上的应用程序,出了把gdb编译进uclinux之外还有没有什么其他可行的办法?

      我想除了调试学习内核之外,有很多人是在缺乏硬件环境的情况下,希望为应用程序的开发搭建一个虚拟的硬件仿真软件环境,能在上面开发或移植应用程序。     
       最近我有一个任务是将嵌入式java虚拟机kvm移植到arm-uclinux平台上,所以我想在skyeye上进行调试,以前一直是做上层的,跟用户交互的东西,对嵌入式开发接触没多久,希望能跟大家多交流,关于uclinux on skyeye上应用程序调试环境的建立,希望能得到大家的指点。
回复

使用道具 举报

发表于 2004-6-18 19:17:54 | 显示全部楼层
不知道你的具体情况.不过我在使用gdbserver也有
Reply contains invalid hex digit 59
的问题.
检查了一下,我是直接采用的uclinux-disc包,里面的
gdbserver根本是for m68k,not for arm.
我简单改动了一下gdbserver和uclinux的代码for arm,
gdbserver 可以执行,但是无法支持断点.
看来这个uclinux-disc带的gdbserver确实有不少问题.
建议
1)如果google看没有现成的,
回复

使用道具 举报

发表于 2004-6-21 13:52:10 | 显示全部楼层
总算将uClinux disc自带的gdbserver for m68k改成了for arm-uclinux的版本.
回复

使用道具 举报

发表于 2004-6-23 00:23:39 | 显示全部楼层
prox2004, 你修改gdbserver后可以在SkyEye for AT91上调试应用程序了吗?
急切的问!
回复

使用道具 举报

发表于 2004-6-23 00:35:29 | 显示全部楼层
柯金水(武汉一研究生 [email protected]) 2003-10-29 给我发的email。
意思是gdbserver for arm-elf 需要修改和打补丁,不能直接用uclinux带的。
供参考。

附近里面是我抓的两个图,给您看看。
   就我的感觉,skyeye在远程调试上可能还是存在一点问题的。我换了一个gdbserver,然后在uclinux上执行gdbserver,
    在linux上执行arm-elf-gdb,结果是连接是建立起来了(以前是做不到的);
    曾经有一次,我设置了断点后,敲c命令,可以执行到断点处,感觉基本上可以支持远程调试了,但不知道怎么回事,后来就不行了,只是可以建立连接,原因我一直没有搞明白。(可能与我重新编译内核有关?)
    附近里面还有一个据说是打了补丁的gdbserver(我不知道下载地址,呵呵,说是专门为arm 调试打的),一并发给您
回复

使用道具 举报

发表于 2004-6-23 00:36:16 | 显示全部楼层
柯金水(武汉一研究生 [email protected]) 2003-10-29 给我发的email。
意思是gdbserver for arm-elf 需要修改和打补丁,不能直接用uclinux带的。
供参考。

附近里面是我抓的两个图,给您看看。
   就我的感觉,skyeye在远程调试上可能还是存在一点问题的。我换了一个gdbserver,然后在uclinux上执行gdbserver,
    在linux上执行arm-elf-gdb,结果是连接是建立起来了(以前是做不到的);
    曾经有一次,我设置了断点后,敲c命令,可以执行到断点处,感觉基本上可以支持远程调试了,但不知道怎么回事,后来就不行了,只是可以建立连接,原因我一直没有搞明白。(可能与我重新编译内核有关?)
    附近里面还有一个据说是打了补丁的gdbserver(我不知道下载地址,呵呵,说是专门为arm 调试打的),一并发给您
回复

使用道具 举报

发表于 2004-6-23 09:17:50 | 显示全部楼层
可以进行SkyEye for AT91上应用程序的调试
柯先生提到的问题描述得好象不太清楚,
我只说明我遇到的问题.
未作3)的修改前,断点是不能打的.
gdb for arm的软断点是0xe7ffdefe,
这个magic,skyeye也作了专门的捕捉.
这样skyeye emulate就会停在这句不能执行.
我曾经修改过skyeye,让它继续执行,
结果更糟,uclinux死loop.
arm710_bug_check对0xe7ffdefe的处理很奇怪.
所以,采用0xef9f0001代替0xe7ffdefe作为软断点
另外,陈老师收到我的站内短信么?
回复

使用道具 举报

发表于 2004-6-24 21:42:07 | 显示全部楼层
dttnetchong,你好,最近我也在做关于嵌入式java虚拟机kvm移植到uclinux平台的工作,现在还没有找到什么解决办法了。不知道你有没有什么进展,是否可以选择其他版本的嵌入式linux,请各位执教
回复

使用道具 举报

发表于 2004-7-1 23:08:12 | 显示全部楼层
prox2004已经基本解决了gdb 调试skyeye for at91上跑的应用程序的问题!!!
回复

使用道具 举报

发表于 2004-7-3 09:19:01 | 显示全部楼层
那到底如何解决gdb 调试skyeye for at91上跑的应用程序的问题呢?
回复

使用道具 举报

发表于 2004-7-3 17:01:29 | 显示全部楼层
希望prox2004介绍一下!
回复

使用道具 举报

发表于 2004-7-13 16:43:52 | 显示全部楼层
-------
上次好像有0D0A格式问题.
-------
附件是整个修改后的gdbserver,包括uclinux2.4.17kernel ptrace.c
本来修改比较少,不想把整个东西放上来.
不过,有些朋友要,还是不太方便,就放在这里了.
0)全部修改我已经传给chyyuu,不过目前只有本人的测试
1)gdbserver:     
前面我写的就是对gdbserver本身的全部修改.
2)uclinux kernel2.4.17:
a.但是uclinux2.4.17 for at91(我测试的版本)缺省运行的flat程序是在USER26Mode下,
不是USER32Mode.这样,gdbserver/skyeye(client)的单步运行就会出问题.
我修改了arch/armnommu/kernel/ptrace.c,以支持这种情况.
b.uclinux的ptrace没有对内存读写做限制,很容易搞到进程外内存
//added by telpro
#define REG_SP 13

int in_arm26_mode(struct task_struct *child)
{
        long psr;
        psr = get_stack_long(child, REG_PSR) ;
        return ((psr & 0x1f) <= 3);
}

#define FIXPC(child, x)        \   
        do {            \
                if(in_arm26_mode(child)) x = x & 0x0ffffffc; \
        }while(0)

//do as arch/armnommu/kernel/process.c
//a dirty version, FIXME...telpro
int is_addr_access( struct task_struct *child,
                      unsigned long addr )     
{
        unsigned long sp;
        if ( addr >= child->mm->start_code &&
             addr < child->mm->end_code )
                return 1;

        if ( addr >= child->mm->start_data &&
             addr <  child->mm->brk )
                return 1;
        sp = get_stack_long(child, REG_SP) ;
        //actually <sp is r/w also.
        if ( addr >= sp &&
             addr < child->mm->start_stack )
                return 1;
        return 0;
}
int ptrace_set_bpt(struct task_struct *child)
{
        struct pt_regs *regs;
        unsigned long pc, insn;
        int res;

        regs = get_user_regs(child);
        pc = instruction_pointer(regs);
        //26bit , added by telpro
        FIXPC(child, pc);

        res = read_tsk_long(child, pc, &insn);
        if (!res) {
                struct debug_info *dbg = &child->thread.debug;
                unsigned long alt;

                dbg->nsaved = 0;

                alt = get_branch_address(child, pc, insn);
                if (alt) {  
                        FIXPC(child, alt); //added by telpro
                        res = add_breakpoint_arm(child, dbg, alt);
                }   
.........
}
static int do_ptrace(int request, struct task_struct *child, long addr, long data)              
中加入
                case PTRACE_PEEKTEXT:
                case PTRACE_PEEKDATA:
                        /*added by telpro*/
                        if (!is_addr_access(child, addr) ) {
                                ret = -EIO;
                                break;
                        }
                        ret = read_tsk_long(child, addr, &tmp);  
....
                case PTRACE_POKETEXT:
                case PTRACE_POKEDATA:
                        /*added by telpro*/
                        if (!is_addr_access(child, addr) ) {
                                ret = -EIO;
                                break;
                        }
                        ret = write_tsk_long(child, addr, data);
                        break;  
.......
   case PTRACE_PEEKUSR:
                        ret = -EIO;
                        if ((addr & 3) || addr < 0 || addr >= sizeof(struct user))
                                break;

                        tmp = 0;  /* Default return condition */
                        if (addr < sizeof(struct pt_regs)) {
                                tmp = get_stack_long(child, (int)addr >> 2);
                                //added by telpro, for at91
                                if(addr == 14*4 || addr == 15*4 ) {
                                        FIXPC(child, tmp);
                                }
                        } else if (addr == 49*4) {
                                tmp = child->mm->start_code;
                        } else if (addr == 50*4) {
                                tmp = child->mm->start_data;
                        } else if (addr == 51*4) {      
.....
3)已知问题
a.现在对USER26MOde的应用程序不是支持得很好,
r14,r15是按照USER32Mode显示的结果.
这是不对的.
完整的解决需要修改client端软件,也就是skyeye与gdbserver配合的部分.
不过,USER26总感觉是一种淘汰模式,xscale这些已经不支持它了.
因此,也不想花大力气去解决.
b.Thumb模式不支持

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-26 18:26 , Processed in 0.054914 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表