Tracing, debugging and fixing Row Lock Contentions
Would it be possible to find out which
  line of a stored procedure is causing
  these row lock contentions?


Not exactly but you can get the SQL statement causing the lock and in turn identify the related lines in the procedure.

SELECT sid, sql_text
FROM v$session s
LEFT JOIN v$sql q ON q.sql_id=s.sql_id
WHERE state = 'WAITING' AND wait_class != 'Idle'
AND event = 'enq: TX - row lock contention';



  What would be the general guideline to
  reduce/avoid/eliminate such problems
  with coding?


The Oracle Concepts Guide section on locks says, "A row is locked only when modified by a writer."  Another session updating the same row will then wait for the first session to COMMIT or ROLLBACK before it can continue.  To eliminate the problem you could serialize the users, but here are some things that can reduce the problem perhaps to the level of it not being an issue.


COMMIT more frequently.  Every COMMIT releases locks, so if you can do the updates in batches the likelihood of another session needing the same row is reduced.
Make sure you aren't updating any rows without changing their values.  For example, UPDATE t1 SET f1=DECODE(f2,’a’,f1+1,f1); should be rewritten as the more selective (read fewer locks) UPDATE t1 SET f1=f1+1 WHERE f2=’a’;.  Of course if the changing the statement will still lock the majority of rows in the table then the change will only have a readability benefit.
Make sure you are using sequences rather than locking a table to add one to the highest current value.
Make sure you aren’t using a function that is causing an index to not be used.  If the function is necessary consider making it a function based index.
Think in sets.  Consider whether a loop running a block of PL/SQL doing updates could be rewritten as a single update statement.  If not then perhaps bulk processing could be used with BULK COLLECT ... FORALL.
Reduce the work that gets done between the first UPDATE and the COMMIT.  For example, if the code sends an email after each update, consider queuing the emails and sending them after committing the updates.
Design the application to handle waiting by doing a SELECT ... FOR UPDATE NOWAIT or WAIT 2.  You can then catch the inability to lock the row and inform the user that another session is modifying the same data.