当前位置:编程学习 > C#/ASP.NET >>

请问反射如何调试

一个dll,在服务器端读成byte[](文件流转换),然后通过网络传给客户端。

客户端拿到后,加载进assembly反射调用。

但是,无法调试,断点无响应。。

dll,服务端,客户端,都在一个解决方案里面的,请问这种情况如何调试。。。。 --------------------编程问答-------------------- 是dll的代码无法调试,服务器和客户端还是可以调试的 --------------------编程问答-------------------- 先看是否加载成功,不成功则谈不上调试。反射调用和一般调用是一个原理,只有多线程的情况下,调试才比较麻烦。 --------------------编程问答--------------------
引用 2 楼 qldsrx 的回复:
先看是否加载成功,不成功则谈不上调试。反射调用和一般调用是一个原理,只有多线程的情况下,调试才比较麻烦。


当然加载成功,所有功能都有,包括UI和逻辑,全部杠杠的。

但问题是,莫法直接调试,以后加新功能就会很痛苦,遇到问题只有靠人为的捕捉(写文件或messagebox出来),甚至靠猜,这样效率太低了。。。 --------------------编程问答-------------------- 如果dll是采用引用文件的方式的话,请确定pdb文件与dll文件是否同一次编译时生成的 --------------------编程问答--------------------
引用 3 楼 scarwings 的回复:
当然加载成功,所有功能都有,包括UI和逻辑,全部杠杠的。

但问题是,莫法直接调试,以后加新功能就会很痛苦,遇到问题只有靠人为的捕捉(写文件或messagebox出来),甚至靠猜,这样效率太低了。。。


你加新功能的时候将它继承过来再加不行么? --------------------编程问答--------------------
引用 4 楼 zhaogy0411 的回复:
如果dll是采用引用文件的方式的话,请确定pdb文件与dll文件是否同一次编译时生成的


不是引用,编译好的dll,可能丢到其他目录里了,比如直接桌面。服务器直接读文件到byte[],类似插件的那个感觉。我把pdb文件copy过去根本没有用,因为不是引用加载,是纯文件操作读取的。

也就是说,尽管这个dll是自己生成的,但加载的方式是纯第三方的方式。 --------------------编程问答--------------------
引用 5 楼 icdbow 的回复:
引用 3 楼 scarwings 的回复:当然加载成功,所有功能都有,包括UI和逻辑,全部杠杠的。

但问题是,莫法直接调试,以后加新功能就会很痛苦,遇到问题只有靠人为的捕捉(写文件或messagebox出来),甚至靠猜,这样效率太低了。。。

你加新功能的时候将它继承过来再加不行么?


怎么个继承法,愿闻其详。。

比如我加了一个按钮,按钮里面报错了,无法调试我就只能用猜的了。。。 --------------------编程问答--------------------
引用 7 楼 scarwings 的回复:
怎么个继承法,愿闻其详。。

比如我加了一个按钮,按钮……


兄台,继承过来实现新的功能,这个是新的类了,是你本机新建的类,调试有问题么?
原类如果健康的话或者很成熟你为什么要去碰它呢?

举例,当前用的所有类都是继承Object的,包括你的Button类,你加按钮报错了,你会去Object里边找么? --------------------编程问答-------------------- 所有错误都显示详细的错误堆栈的,可以跟踪到错误源,只不过无法断点到dll内部,外部调用的位置可以断点,之后如果是dll内部错误,就要查看错误堆栈和内部错误信息,分析具体哪个部位出错,如果每个功能都是一个小的方法,可以精确到具体某个方法出错,如果你一个方法执行完毕所有功能,就不知道具体什么位置错了。 --------------------编程问答--------------------
引用 8 楼 icdbow 的回复:
兄台,继承过来实现新的功能,这个是新的类了,是你本机新建的类,调试有问题么?
原类如果健康的话或者很成熟你为什么要去碰它呢?

举例,当前用的所有类都是继承Object的,包括你的Button类,你加按钮报错了,你会去Object里边找么?

继承还是无法将断点打入父类中去的,而错误是由父类引发的情况下,就必须查找父类的实现过程,对父类修改,这里的父类因为也是自己写的,所以不见得正确,也需要调试,但是楼主的父类未经过调试就通过dll给另一方加载,由另一方去调试,自然困难重重。 --------------------编程问答-------------------- 可能是编程习惯的问题,如果遇到新功能的添加,因为父类引起的异常,退一步来说,即使让你父类下得到断点,你会怎么做?去修改父类么?那之前使用该类的方法是否都会受到影响?

什么类都有瑕疵,不然软件不会版本更替,新的版本要想保证向下兼容性,我认为这样做是必须的。如果有功能正在做,和父类冲突,那就改功能,或者重新用新的方法实现。 --------------------编程问答--------------------
引用 11 楼 icdbow 的回复:
可能是编程习惯的问题,如果遇到新功能的添加,因为父类引起的异常,退一步来说,即使让你父类下得到断点,你会怎么做?去修改父类么?那之前使用该类的方法是否都会受到影响?

什么类都有瑕疵,不然软件不会版本更替,新的版本要想保证向下兼容性,我认为这样做是必须的。如果有功能正在做,和父类冲突,那就改功能,或者重新用新的方法实现。


是这样的,因为需要实现成类似插件那种功能,所以dll里面任何的类,对客户端或服务端都是不可见的。调用方甚至根本不知道这样一个dll以及里面的类的存在。你看dll都读成字节流,然后下载到客户端,再反射出来调公共接口显示界面。这样一个dll,里面的代码似乎根本无法调试。。。 --------------------编程问答--------------------
引用 9 楼 qldsrx 的回复:
所有错误都显示详细的错误堆栈的,可以跟踪到错误源,只不过无法断点到dll内部,外部调用的位置可以断点,之后如果是dll内部错误,就要查看错误堆栈和内部错误信息,分析具体哪个部位出错,如果每个功能都是一个小的方法,可以精确到具体某个方法出错,如果你一个方法执行完毕所有功能,就不知道具体什么位置错了。


就是这样啊,我是可以捕获到外部调用点,但dll内部不能步步跟踪,debug的效率好低哦。所以我才问有没有办法可以跟踪到dll里面去,毕竟dll的代码跟其他工程在一起的。 --------------------编程问答-------------------- dll编写好后,先在服务端调试正确了再发布啊。要确保所有异常都是可以被捕获的,可以给出对应信息的才行,将所有未知异常都处理掉。到了客户端,使用dll的时候,对于异常只需要给出信息提醒用户即可,无需任何处理,做不到就是设计问题了。 --------------------编程问答--------------------
引用 3 楼 scarwings 的回复:
当然加载成功,所有功能都有,包括UI和逻辑,全部杠杠的。

但问题是,莫法直接调试,以后加新功能就会很痛苦,遇到问题只有靠人为的捕捉(写文件或messagebox出来),甚至靠猜,这样效率太低了。。。

看不出你所谓的“调试”是什么意思。如果仅仅是断点没有中断,那只能说明那个代码根本没有走到,而不是不能中断。

回到编程知识上来说,如果你能“写文件或者messagebox”,那么你就能写断言。为什么不写正规的断言,却要写什么文件呢? --------------------编程问答--------------------
引用 6 楼 scarwings 的回复:
不是引用,编译好的dll,可能丢到其他目录里了,比如直接桌面。服务器直接读文件到byte[],类似插件的那个感觉。我把pdb文件copy过去根本没有用,因为不是引用加载,是纯文件操作读取的。

也就是说,尽管这个dll是自己生成的,但加载的方式是纯第三方的方式。

这就谈不上调试了!你的开发方法有问题。

实际上任何东西,你都需要一个测试引擎。例如你写一个类库工程,那么你就需要一个console或者windows应用程序调用它,然后写上一百个测试程序,经常将这一百个程序跑上一千遍,这个类库工程才给其它程序(你的所谓“客户端程序”)使用。而你的客户端程序也是一样的开发机制。

如果没有测试驱动的基本概念,你就是拿最终要发布给客户的程序来“调试”,那么这种开发方法应该说是非常低级的,是纯粹学校里的业余手工开发方法。可惜很多刚毕业一两年的人,没有找对一个好的软件公司,所以学不到真正工程项目中的开发方法和技术,他所在的公司还是那种“只要拼凑出程序就OK”的想法。 --------------------编程问答-------------------- 靠“调试”来发布产品的人,其软件编程的质量通常是极其极其不靠谱的。

一个有质量的产品,它变得很复杂、(应需求变化而)千变万化地修改了之后,让然可以非常敏捷地开发。这不是靠调试,是靠测试。真正了解测试驱动技术的人,很少调试(虽然总是更加熟练地调试),因为测试就非常及时地告诉他bug了,他的问题不会堆积在一起爆发,因此往往都是每一次都修改一两行代码就能快速迭代开发。

如果我们遇到一个人仅仅抱着“调试开发”的思路来问问题,我们甚至可以想见他可能非常难以接受我们的好的建议。因为他开发方法就不对,他以拼凑见长,而不是以灵活地设计见长。 --------------------编程问答--------------------
引用 16 楼 sp1234 的回复:
引用 6 楼 scarwings 的回复:
不是引用,编译好的dll,可能丢到其他目录里了,比如直接桌面。服务器直接读文件到byte[],类似插件的那个感觉。我把pdb文件copy过去根本没有用,因为不是引用加载,是纯文件操作读取的。

也就是说,尽管这个dll是自己生成的,但加载的方式是纯第三方的方式。
这就谈不上调试了!你的开发方法有问题。

实际上任何东西,你都需要一个测试引擎。……


+++++ --------------------编程问答--------------------
引用 16 楼 sp1234 的回复:
引用 6 楼 scarwings 的回复:不是引用,编译好的dll,可能丢到其他目录里了,比如直接桌面。服务器直接读文件到byte[],类似插件的那个感觉。我把pdb文件copy过去根本没有用,因为不是引用加载,是纯文件操作读取的。

也就是说,尽管这个dll是自己生成的,但加载的方式是纯第三方的方式。
这就谈不上调试了!你的开发方法有问题。

实际上任何东西,……


我承认你的说教很有用,给了我另外的思路。不过问题本身,就事论事的话我没看到解决办法
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,