不好意思,还是关于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需要修改,从上面的错误,是否可以知道如何入手,不知道谁有没有经验可以介绍一下 另外,我的虚拟网卡装好之后,
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登陆,但之后根本传不了东西。
是不是我什么地方还没做对? 我的也是负值,不知道怎么回事呀 在gdbserver不能使用的情况下,如果要调试运行在uclinux on skeye上的应用程序,出了把gdb编译进uclinux之外还有没有什么其他可行的办法?
我想除了调试学习内核之外,有很多人是在缺乏硬件环境的情况下,希望为应用程序的开发搭建一个虚拟的硬件仿真软件环境,能在上面开发或移植应用程序。
最近我有一个任务是将嵌入式java虚拟机kvm移植到arm-uclinux平台上,所以我想在skyeye上进行调试,以前一直是做上层的,跟用户交互的东西,对嵌入式开发接触没多久,希望能跟大家多交流,关于uclinux on skyeye上应用程序调试环境的建立,希望能得到大家的指点。 不知道你的具体情况.不过我在使用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看没有现成的, 总算将uClinux disc自带的gdbserver for m68k改成了for arm-uclinux的版本. prox2004, 你修改gdbserver后可以在SkyEye for AT91上调试应用程序了吗?
急切的问! 柯金水(武汉一研究生 [email protected]) 2003-10-29 给我发的email。
意思是gdbserver for arm-elf 需要修改和打补丁,不能直接用uclinux带的。
供参考。
附近里面是我抓的两个图,给您看看。
就我的感觉,skyeye在远程调试上可能还是存在一点问题的。我换了一个gdbserver,然后在uclinux上执行gdbserver,
在linux上执行arm-elf-gdb,结果是连接是建立起来了(以前是做不到的);
曾经有一次,我设置了断点后,敲c命令,可以执行到断点处,感觉基本上可以支持远程调试了,但不知道怎么回事,后来就不行了,只是可以建立连接,原因我一直没有搞明白。(可能与我重新编译内核有关?)
附近里面还有一个据说是打了补丁的gdbserver(我不知道下载地址,呵呵,说是专门为arm 调试打的),一并发给您 柯金水(武汉一研究生 [email protected]) 2003-10-29 给我发的email。
意思是gdbserver for arm-elf 需要修改和打补丁,不能直接用uclinux带的。
供参考。
附近里面是我抓的两个图,给您看看。
就我的感觉,skyeye在远程调试上可能还是存在一点问题的。我换了一个gdbserver,然后在uclinux上执行gdbserver,
在linux上执行arm-elf-gdb,结果是连接是建立起来了(以前是做不到的);
曾经有一次,我设置了断点后,敲c命令,可以执行到断点处,感觉基本上可以支持远程调试了,但不知道怎么回事,后来就不行了,只是可以建立连接,原因我一直没有搞明白。(可能与我重新编译内核有关?)
附近里面还有一个据说是打了补丁的gdbserver(我不知道下载地址,呵呵,说是专门为arm 调试打的),一并发给您 可以进行SkyEye for AT91上应用程序的调试
柯先生提到的问题描述得好象不太清楚,
我只说明我遇到的问题.
未作3)的修改前,断点是不能打的.
gdb for arm的软断点是0xe7ffdefe,
这个magic,skyeye也作了专门的捕捉.
这样skyeye emulate就会停在这句不能执行.
我曾经修改过skyeye,让它继续执行,
结果更糟,uclinux死loop.
arm710_bug_check对0xe7ffdefe的处理很奇怪.
所以,采用0xef9f0001代替0xe7ffdefe作为软断点
另外,陈老师收到我的站内短信么? dttnetchong,你好,最近我也在做关于嵌入式java虚拟机kvm移植到uclinux平台的工作,现在还没有找到什么解决办法了。不知道你有没有什么进展,是否可以选择其他版本的嵌入式linux,请各位执教 prox2004已经基本解决了gdb 调试skyeye for at91上跑的应用程序的问题!!! 那到底如何解决gdb 调试skyeye for at91上跑的应用程序的问题呢? 希望prox2004介绍一下! -------
上次好像有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