dttnetchong 发表于 2004-6-16 23:36:16

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

今天换了不同程序反复试了一下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需要修改,从上面的错误,是否可以知道如何入手,不知道谁有没有经验可以介绍一下

dttnetchong 发表于 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登陆,但之后根本传不了东西。
是不是我什么地方还没做对?

magicsurfer 发表于 2004-6-17 07:39:49

我的也是负值,不知道怎么回事呀

dttnetchong 发表于 2004-6-17 13:59:35

在gdbserver不能使用的情况下,如果要调试运行在uclinux on skeye上的应用程序,出了把gdb编译进uclinux之外还有没有什么其他可行的办法?

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

prox2004 发表于 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看没有现成的,

prox2004 发表于 2004-6-21 13:52:10

总算将uClinux disc自带的gdbserver for m68k改成了for arm-uclinux的版本.

chyyuu 发表于 2004-6-23 00:23:39

prox2004, 你修改gdbserver后可以在SkyEye for AT91上调试应用程序了吗?
急切的问!

chyyuu 发表于 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 调试打的),一并发给您

chyyuu 发表于 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 调试打的),一并发给您

prox2004 发表于 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作为软断点
另外,陈老师收到我的站内短信么?

frame 发表于 2004-6-24 21:42:07

dttnetchong,你好,最近我也在做关于嵌入式java虚拟机kvm移植到uclinux平台的工作,现在还没有找到什么解决办法了。不知道你有没有什么进展,是否可以选择其他版本的嵌入式linux,请各位执教

chyyuu 发表于 2004-7-1 23:08:12

prox2004已经基本解决了gdb 调试skyeye for at91上跑的应用程序的问题!!!

houen 发表于 2004-7-3 09:19:01

那到底如何解决gdb 调试skyeye for at91上跑的应用程序的问题呢?

chyyuu 发表于 2004-7-3 17:01:29

希望prox2004介绍一下!

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模式不支持
页: [1] 2
查看完整版本: 不好意思,还是关于gdbserver^_^!