old-www/HOWTO/SCSI-Generic-HOWTO/debugging.html

220 lines
3.6 KiB
HTML

<HTML
><HEAD
><TITLE
>Debugging</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
"><LINK
REL="HOME"
TITLE="The Linux SCSI Generic (sg) HOWTO"
HREF="index.html"><LINK
REL="PREVIOUS"
TITLE="Programming example"
HREF="pexample.html"><LINK
REL="NEXT"
TITLE="Other references"
HREF="refs.html"></HEAD
><BODY
CLASS="APPENDIX"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
SUMMARY="Header navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>The Linux SCSI Generic (sg) HOWTO</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="pexample.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="refs.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="APPENDIX"
><H1
><A
NAME="DEBUGGING">Appendix D. Debugging</H1
><P
>There are various ways to debug what is happening with the sg driver.
The information provided in the <TT
CLASS="FILENAME"
>/proc/scsi/sg</TT
>
directory can be useful, especially the <TT
CLASS="FILENAME"
>debug</TT
>
pseudo file. It outputs the state of the sg driver when it is called.
Invoking it at the right time can be a challenge. One approach (used in
SANE) is to invoke the system() system call like this:
<TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="PROGRAMLISTING"
> system("cat /proc/scsi/sg/debug");</PRE
></FONT
></TD
></TR
></TABLE
>
at appropriate times within an application that is using the sg driver.</P
><P
>Another debugging technique is to trace all system calls a program makes
with the <B
CLASS="COMMAND"
>strace</B
> command (see its "man" page). This
command can also be used to obtain timing information (with the
"-r" and "t" options).</P
><P
>To debug the sg driver itself then the kernel needs to be built with
CONFIG_SCSI_LOGGING selected. Then copious output will be sent by the sg
driver whenever it is invoked to the log (normally
<TT
CLASS="FILENAME"
>/var/log/messages</TT
>) and/or the console.
This debug output is turned on by:
<TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="PROGRAMLISTING"
> $ echo "scsi log timeout 7" &#62; /proc/scsi/scsi</PRE
></FONT
></TD
></TR
></TABLE
>
As the number (i.e. 7) is reduced, less output is generated. To turn off
this type of debugging use:
<TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="PROGRAMLISTING"
> $ echo "scsi log timeout 0" &#62; /proc/scsi/scsi</PRE
></FONT
></TD
></TR
></TABLE
></P
><P
>If you want the system to log SCSI (CHECK_CONDITION related) errors that
sg detects rather than process them within the application using sg
then set ioctl(SG_SET_DEBUG) to a value greater than zero.
Processing SCSI errors within the application using sg is my preference.</P
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
SUMMARY="Footer navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="pexample.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
ACCESSKEY="H"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="refs.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Programming example</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Other references</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>